我正在尝试使用 Google Test 测试功能。
似乎一切都设置正确,并且在没有 gtest 的情况下构建和执行都很好......(代码有点复杂,所以我无法在此处列出所有源文件,但不添加 gtest,文件正在链接正确,并按应有的方式运行)。
这是一个应用程序类型的项目。它有许多库依赖项......无关紧要。
测试项目作为单独的项目添加到解决方案中。它具有经过测试的项目作为依赖项。测试项目的.h文件只指向gtest....cpp(不是main,是标准的InitGoogleTest main)添加了自己的头文件,测试项目的头文件,有如下图所示的测试.
项目构建时会自动创建一个 TestedProject.lib,即使它是一个应用程序。我已将 TestedProject.lib 作为库依赖项添加到 TestProject(在链接中)。
Class x
{
public:
x(){} // I didn't really need this, I only added the class so I have access to
~x(){}; // non-class methods with gtest - but it still doesn't work
bool myFunction(std::string a, double b, bool c);
};
执行:
bool x::myFunction(std::string a, double b, bool c)
{
// implementation
return false;
}
somewhere_else
{
x x_instance;
y = x_instance.myFunction("a", 1, false); // works, all builds, executes, life is great
}
添加单元测试:
class TheTest : public ::testing::Test
{
protected:
x x_instance;
};
TEST_F(TheTest, Fail)
{
EXPECT_FALSE(x_instance.myFunction("a", 1, false));
}
不建。链接错误(已修改,和上面的示例代码一样,用了简化的名字,希望没有把内容弄乱)
Error 2 error LNK2019: unresolved external symbol
"public: bool __thiscall x::myFunction(class std::basic_string<char,struct std::char_traits<char>,double,bool)"
(?myFunction@x@@QAE_NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@00000NNNN_N1@Z)
referenced in function "private: virtual void __thiscall TheTest_Fail_Test::TestBody(void)"
(?TestBody@TheTest_Fail_Test@@EAEXXZ) C:\path\file.obj
我以前做过这个——解决了链接错误——用谷歌测试写了几个测试——但我看不到任何遗漏。
作为测试,我写了一点
int test(){return 4;} 在头文件中,在类声明中...
然后,将测试替换为 EXPECT_EQ(x.test(), 4);
有效。伟大的。但这意味着将所有经过测试的代码都放在一个文件、一个 cpp 或其他东西中……这简直是不合理的。此应用程序项目中有几个文件。
我该如何解决这个问题?如何使用带有标头和实现文件的类进行 Google 测试链接和测试?当该标头/实现位于“应用程序”类型的不同项目中时?
到目前为止,我发现的唯一类似问题是:C++ linking issue on Visual Studio 2008 when crosslinking different projects on same solution
请帮我找到解决办法。