我想用谷歌测试测试一个函数。链接器错误 - 链接两个“应用程序”类型的项目,以便使用谷歌测试
看来,一切都设置正确,它建立和执行没有gtest罚款...(有一点复杂的代码,所以我不能列出所有的源文件在这里,但没有添加gtest,这些文件链接正确,并按照它们的运行方式运行)。
这是一个应用程序类型项目。它有一些库依赖关系......无关紧要。
测试项目作为独立项目添加到解决方案中。它将测试的项目作为依赖项。测试项目的.h文件只指向gtest ... .cpp(不是main,这是标准的InitGoogleTest主)添加它自己的头文件,测试项目的头文件,并且具有如下所示的测试。
当项目构建时,即使它是应用程序,也会自动创建TestedProject.lib。我已将TestedProject.lib作为库依赖项添加到TestProject(在Link中)。
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)"
([email protected]@@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected])
referenced in function "private: virtual void __thiscall TheTest_Fail_Test::TestBody(void)"
([email protected][email protected]@EAEXXZ) C:\path\file.obj
我已经这样做过 - 解决链接错误 - 写了几个测试与谷歌测试 - 但我看不到任何东西丢失。
作为测试,我写了一个小
INT测试(){返回4;}在头文件 ,在类声明...
然后,代替测试与 EXPECT_EQ(x.test(),4);
它工作。大。但这意味着将所有测试过的代码放在一个文件中,一个cpp或其他东西......这简直是不合理的。这个应用程序项目中有几个文件。
我该如何解决这个问题?如何使Google测试链接并使用包含头文件和实现文件的类进行测试?当这个头文件/实现在不同的项目中时,“Application”类型?
唯一类似的问题,我发现,到目前为止:C++ linking issue on Visual Studio 2008 when crosslinking different projects on same solution
请帮我找到一个解决方案。
通常你会有一个库(或一些库),它们构成了你自己的代码的大部分,而一个只有'main'函数的exe /应用程序链接你的lib(s)。通过这种方式,您可以使用另一个'main'和一堆测试代码(如果需要的话,可以使用多个文件)来另一个项目,这些代码也*链接您的lib。您不应该期望能够将2个应用程序与2个'main'链接起来。 – Fraser 2013-03-08 09:01:38
谢谢。这就是我最终实现它的原因,只要我完成了问题的提问,确实 - 当我找到我添加的链接时,链接帮助我找出了问题。我不得不创建一个单独的项目,只提取一个小的main()放入它。我确实希望能够将2个应用程序与main()...链接起来,并且花了很长时间才弄清楚我不能。我确定在某处有一个“链接错误手册”,或者“什么可以被测试的手册”,或者“其他人尝试和失败的东西,所以尽量不要犯同样的错误”手册...我想阅读它。 – Thalia 2013-03-08 20:32:51
对 - 我也是!编译器错误通常比链接器更容易解决。 – Fraser 2013-03-08 21:02:10