2012-11-22 48 views
3

以下测试代码创建一个server-和一个clientsocket。然后客户端向服务器和服务器回复发送消息。就这样。但我无法编译。线程函数中的所有ASSERT_EQ都会引发错误"error: void value not ignored as it ought to be"。我不知道这应该告诉我什么。这里有什么问题?类型无关,因为ASSERT_EQ(1, 1);也会产生错误。如何在谷歌测试中测试多线程?

编辑从谷歌看到这个常见问题:

问:我的编译器抱怨“空值不被忽略,因为它应该是。”这是什么意思?

答:您可能在不返回void的函数中使用ASSERT_XY()。 ASSERT_XY()只能在void函数中使用。

我该如何理解这一点?

void * serverfunc(void * ptr); 
void * clientfunc(void * ptr);  

TEST(netTest, insert) 
{ 
    pthread_t mThreadID1, mThreadID2; 
    ::pthread_create(&mThreadID1, nullptr, serverfunc, nullptr); 
    ::sleep(1); 
    ::pthread_create(&mThreadID1, nullptr, clientfunc, nullptr); 
    ::pthread_join(mThreadID1, nullptr); 
    ::pthread_join(mThreadID2, nullptr);   
} 

void * serverfunc(void * ptr) 
{ 
    net::ServerSocket serv(IPV4, TCP, 55555,5); 
    net::ServerSocket * conn = serv.accept(); 
    net::Message msg; 

    conn->recvmsg(&msg); 

    ASSERT_EQ(msg.size(),5); 
    ASSERT_EQ(msg[0],1); 
    ASSERT_EQ(msg[1],2); 
    ASSERT_EQ(msg[2],3); 
    ASSERT_EQ(msg[3],4); 
    ASSERT_EQ(msg[4],5); 

    msg = {9,8,6}; 
    ASSERT_EQ(msg.size(),3); 
    ASSERT_EQ(msg[0],9); 
    ASSERT_EQ(msg[1],8); 
    ASSERT_EQ(msg[2],6); 

    conn->sendmsg(msg); 

    ::sleep(1); 

    delete conn; 
    return 0; 
} 

void * clientfunc(void * ptr) 
{ 
    net::ClientSocket clie(IPV4, TCP, "localhost",55555); 
    net::Message msg; 

    msg = {1,2,3,4,5}; 
    ASSERT_EQ(msg.size(),5); 
    ASSERT_EQ(msg[0],1); 
    ASSERT_EQ(msg[1],2); 
    ASSERT_EQ(msg[2],3); 
    ASSERT_EQ(msg[3],4); 
    ASSERT_EQ(msg[4],5); 

    clie.sendmsg(msg); 

    clie.recvmsg(&msg); 

    ASSERT_EQ(msg.size(),3); 
    ASSERT_EQ(msg[0],9); 
    ASSERT_EQ(msg[1],8); 
    ASSERT_EQ(msg[2],6); 

    return 0; 
} 
+0

可以使用EXPECT_THAT相反,我认为它输出警告而不是错误,虽然 – paulm

回答

6

问:我的编译器抱怨说“void value不应该被忽略,因为它应该是。” 这是什么意思?

答:您可能在函数中使用ASSERT_XY(),而函数不会返回 。 ASSERT_XY()只能在void函数中使用。

我该如何理解这一点?

你的函数不返回void,他们返回void* - 即他们返回的东西(void*是一个指针到任何东西),而他们应该返回什么。 FAQ说使用ASSERT_EQ()具有void返回类型的函数是必需的。

0

它看起来像ASSERT_EQ只能用正确的返回类型的函数(当你返回void这似乎是无效*)被称为

个人而言,我不喜欢宏过度使用,但是这就是它的方式。宏的问题是它混淆了代码,所以你看不到它做错了什么。

所以,只需编写这样一个函数,并让serverfunc和clientfunc来调用它。

+0

这不完全正确。我也在其他函数中使用ASSERT_EQ(这是从GTest单元测试中调用的) – Philipp

+2

限制是ASSERT_EQ必须位于返回void的函数中。 –

+0

谢谢你,@TylerMcHenry 有趣的是,他们设法为其他没有宏的语言制作这些测试工具,但是当他们为C++实现它时,它总是充满了它们。 – CashCow

0

建议您应该将您的方法的void*类型替换为voidreturn 0return

1

我有同样的问题,也和我发现了一个“丑”的方式来解决这个问题:

void* your_func(void* ptr) 
{ 
    _your_func(ptr); 
    reutrn NULL; 
} 

void _your_func(void* ptr) 
{ 
    ... 
    ASSERT_EQ(1, 1); 
    ... 
}