为什么谷歌测试ASSERT_FALSE在方法中不起作用,但EXPECT_FALSE起作用

时间:2013-07-31 04:55:51

标签: c++ googletest

ASSERT_TRUEASSERT_FALSE都没有在LibraryTest类中编译并出错。

  

错误C2664:   “的std :: basic_string的< _Elem,_Traits,_Alloc> :: basic_string的(常量   的std :: basic_string的< _Elem,_Traits,_Alloc> &)':无法转换参数   1从'void'到'const std :: basic_string< _Elem,_Traits,_Alloc> &安培;'

它在我使用的任何TEST_F中起作用。 但是EXPECT_FALSE类和LibraryTest方法中的TEST_F编译良好。

如何在ASSERT使用的方法中使用TEST_F

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);
}

2 个答案:

答案 0 :(得分:4)

如果新的C ++标准是项目的一部分,那么您可以简单地解决这个问题。

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

void create_library(const string &libName, string &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_); }()

...

答案 1 :(得分:3)

使用任何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);
}