gpt4 book ai didi

googletest - 断言_ throw : error: void value not ignored as it ought to be

转载 作者:行者123 更新时间:2023-12-04 16:07:38 26 4
gpt4 key购买 nike

我是gtest的初学者。我尝试使用 ASSERT_THROW 会编译失败。任何人都可以帮助解决这个问题:

class my_exp {};

int main(int argc, char *argv[])
{
EXPECT_THROW(throw my_exp(), my_exp); // this will pass
// This will through below compilation error
ASSERT_THROW(throw my_exp(), my_exp);
return 0;
}

编译输出:
ERROR : 
In file included from /usr/include/gtest/gtest.h:57:0,
from gtest.cpp:1:
gtest.cpp: In function ‘int main(int, char**)’:
gtest.cpp:12:3: error: void value not ignored as it ought to be
ASSERT_THROW(throw my_exp(), my_exp);
^

最佳答案

短版
你写测试的方式不对,写测试you should将断言放入测试(宏 TEST )或测试装置(宏 TEST_F )。
长版
1 .到底发生了什么?
找出真正的问题并不容易,因为 Google 测试框架使用隐藏真实代码的宏。要查看执行预处理所需的宏替换后的代码,如下所示:

g++ -E main.cpp -o main.p
使用 ASSERT_THROW时预处理的结果看起来像这样(格式化后):
class my_exp {};

int main(int argc, char *argv[])
{
switch (0)
case 0:
default:
if (::testing::internal::ConstCharPtr gtest_msg = "") {
bool gtest_caught_expected = false;
try {
if (::testing::internal::AlwaysTrue () ) {
throw my_exp ();
};
} catch (my_exp const &) {
gtest_caught_expected = true;
} catch (...) {
gtest_msg.value = "Expected: throw my_exp() throws an exception of type my_exp.\n Actual: it throws a different type.";
goto gtest_label_testthrow_7;
} if (!gtest_caught_expected) {
gtest_msg.value = "Expected: throw my_exp() throws an exception of type my_exp.\n Actual: it throws nothing.";
goto gtest_label_testthrow_7;
}
}
else
gtest_label_testthrow_7:
return ::testing::internal::AssertHelper (::testing::TestPartResult::kFatalFailure, "main.cpp", 7, gtest_msg.value) = ::testing::Message ();

return 0;
}
对于 EXPECT_THROW除了一些不同外,结果将相同:
    else
gtest_label_testthrow_7:
::testing::internal::AssertHelper (::testing::TestPartResult::kNonFatalFailure, "main.cpp", 7, gtest_msg.value) = ::testing::Message ();
2 . OK,不同行为的原因找到了,我们继续。
在文件 src/gtest.cc可以找到 AssertHelper类声明包括返回 void 的赋值运算符:
void AssertHelper::operator=(const Message& message) const
所以现在编译器提示的原因被澄清了。
3 .但是为什么会出现这个问题还不清楚。尝试了解为什么 ASSERT_THROWEXPECT_THROW生成了不同的代码。答案是文件 include/gtest/internal/gtest-internal.h 中的宏
#define GTEST_FATAL_FAILURE_(message) \
return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)

#define GTEST_NONFATAL_FAILURE_(message) \
GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)
其中包含 return对于致命的情况。
4 .但现在的问题是为什么这个断言通常效果很好?
要回答这个问题,请尝试调查在测试中放置断言时以正确方式编写的代码:
#include <gtest/gtest.h>

class my_exp {};

TEST (MyExp, ThrowMyExp)
{
ASSERT_THROW (throw my_exp (), my_exp);
}
为了排除答案的污染,我只注意到在这种情况下 return ASSERT_THROW 的声明也存在,但它被放置在方法中:
void MyExp_ThrowMyExp_Test::TestBody ()
返回 void !但是在您的示例中,断言放在 main 内返回 int 的函数.看起来这是问题的根源!
尝试用简单的片段证明这一点:
void f1 () {};
void f2 () {return f1();};
//int f2 () {return f1();}; // error here!

int main (int argc, char * argv [])
{
f2;
return 0;
}
5 .所以最后的答案是: ASSERT_THROW宏包含计算结果为 void 的表达式的返回语句当这样的表达式被放入返回非 void 值的函数中时,gcc 会提示错误。
附言但无论如何,我不知道为什么使用一种情况返回,而另一种情况则不使用。
更新 : 我在 GitHub 上问过这个问题并得到以下答案:

ASSERT_XXX is used as a poor man's exception to allow it to work inenvironments where exceptions are disabled. It does a return; instead.It is meant to be used from within the TEST() methods, which returnvoid.


更新 :我刚刚意识到 the official documentation 中描述的这个问题:

By placing it in a non-void function you'll get a confusing compile error > like "error: void value not ignored as it ought to be".

关于googletest - 断言_ throw : error: void value not ignored as it ought to be,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34696483/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com