C++ 为什么google test ASSERT_FALSE在方法中不起作用,而EXPECT_FALSE在方法中起作用

C++ 为什么google test ASSERT_FALSE在方法中不起作用,而EXPECT_FALSE在方法中起作用,c++,googletest,C++,Googletest,ASSERT\u TRUE和ASSERT\u FALSE都没有在LibraryTest类中编译,并出现错误 错误C2664: 'std::basic_string::basic_string(常量 std::basic_string&'):无法转换参数 1从“void”到“const std::basic_string&” 它在我使用的任何测试中都有效。 但是EXPECT\u FALSE在LibraryTest类和TEST\u F方法中编译得很好 如何在测试所使用的方法中使用ASSERT cla

ASSERT\u TRUE
ASSERT\u FALSE
都没有在
LibraryTest
类中编译,并出现错误

错误C2664: 'std::basic_string::basic_string(常量 std::basic_string&'):无法转换参数 1从“void”到“const std::basic_string&”

它在我使用的任何
测试中都有效。
但是
EXPECT\u FALSE
LibraryTest
类和
TEST\u F
方法中编译得很好

如何在
测试所使用的方法中使用
ASSERT

class LibraryTest : public ::testing::Test
{
public:
    string create_library(string libName)
    {
        string libPath = setup_library_file(libName);

        LibraryBrowser::reload_models();

        ASSERT_FALSE(library_exists_at_path(libPath));
        new_library(libName, libPath);
        ASSERT_TRUE(library_exists_at_path(libPath));
        EXPECT_FALSE(library_exists_at_path(libPath));
        return libPath;
    }
};

TEST_F(LibraryTest, libraries_changed)
{
    string libName = "1xEVTestLibrary";
    string libPath = create_library(libName);
}

使用任何gtest断言的函数都需要返回
void
。在您的情况下,您可以通过以下方式更改功能:

void create_library(const string &libName, string &libPath) {
  libPath = ...
  ASSERT_FALSE(...)
}
然后像这样使用它:

TEST_F(LibraryTest, libraries_changed) {
  string libName = "foo";
  string libPath;
  create_library(libName, libPath);
}

如果新的C++标准是项目的一部分,那么你可以简单地解决它。

#if __cplusplus < 201103L
#error lambda is not supported
#endif

void create_library(const string &libName, string &libPath) {
  libPath = ...
  []() -> void { ASSERT_FALSE(...); }();
}
\if\uu cplusplus<201103L
#不支持错误lambda
#恩迪夫
void create_库(常量字符串和libName、字符串和libPath){
libPath=。。。
[]()->void{ASSERT_FALSE(…);}();
}
甚至可以重新定义这些宏:

mygtest.hpp

#include <gtest/gtest.hpp>

#if __cplusplus < 201103L
#error lambda is not supported
#endif

// gtest asserts rebind with the `void` error workaround (C++11 and higher is required)
#undef ASSERT_TRUE
#define ASSERT_TRUE(condition) []() -> void { GTEST_TEST_BOOLEAN_((condition), #condition, false, true, GTEST_FATAL_FAILURE_); }()
#undef ASSERT_FALSE
#define ASSERT_FALSE(condition) []() -> void { GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, GTEST_FATAL_FAILURE_); }()

...
#包括
#如果uu cplusplus<201103L
#不支持错误lambda
#恩迪夫
//gtest断言使用“void”错误解决方法重新绑定(需要C++11及更高版本)
#未定义断言为真
#定义ASSERT_TRUE(condition)[]()->void{GTEST_TEST_BOOLEAN_((condition),#condition,false,TRUE,GTEST_FAILURE_)}()
#未定义断言错误
#定义ASSERT_FALSE(condition)[]()->void{GTEST_TEST_BOOLEAN_(!(condition),#condition,true,FALSE,GTEST_FATAL_FAILURE)}()
...

这违背了ASSERT vs EXPECT的目的。@Thomas事实上,谷歌ASSERT实现违背了在任何地方使用ASSERT的想法。