[英]Visual Studio 2015 C++ Unit Test
我正在尝试学习如何在Visual Studio中使用C ++进行单元测试。
我创建了一个名为Adder
的超级简单类,正如您可能猜到的那样,它增加了2个数字。
这是.h文件:
#ifndef ADDER
#define ADDER
class Adder {
private:
int num1, num2;
public:
Adder(int, int);
~Adder();
int add();
};
#endif
所以我用Native Unit Test创建了一个新项目,并在其中引用了我的Adder项目。 我不能只包含#include "adder.h"
的.h文件,所以我不得不使用相对路径。 我阅读了微软的教程 ,看起来你必须使用这种路径。
我的问题是我无法通过单元测试来识别Adder类的方法。 这是我的单元测试:
#include "stdafx.h"
#include "CppUnitTest.h"
#include "../addClass/adder.h" // Added a reference but still can't find without relative path
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{
TEST_CLASS(Adder)
{
public:
TEST_METHOD(add) {
Adder adder1(1, 1); // Won't recognize constructor
int num = adder1.add(); // Won't recognize function
Assert::AreEqual(2, num);
}
};
}
我试图摆脱namespace UnitTest1
因为它看起来像微软在他们的教程中没有。 但这并没有奏效。 我不知道如何让单元测试识别我的方法定义。
万一我在Adder类的实现文件中搞砸了一些东西我会把它放在这里,但我不认为这是问题所在。
#include "adder.h"
Adder::Adder(int a=0, int b=1):num1(a), num2(b){}
Adder::~Adder(){}
int Adder::add() {
return num1 + num2;
}
编辑:以下是我得到的错误:
unittest1.cpp中的第15行:没有构造函数“UnitTest1 :: Adder :: Adder”的实例与参数列表匹配
unittest1.cpp中的第17行:类型为“void”的值不能用于初始化“int”类型的实体
unittest1.cpp中的第15行:'UnitTest :: Adder :: UnitTest1 Adder':没有重载函数需要2个参数
unittest1.cpp中的第17行:'initializing':无法从'void'转换为'int'
编辑2:
好的,所以我将单元测试文件更改为:
#include "stdafx.h"
#include "CppUnitTest.h"
#include "../addClass/adder.h" // Added a reference but still can't find without relative path
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{
TEST_CLASS(test)
{
public:
TEST_METHOD(add) {
::Adder adder1(1,1); // recognizes constructor
int num = adder1.add(); // recognizes function
Assert::AreEqual(1, num);
}
};
}
但是现在我收到链接器错误:
LNK2019未解析的外部符号“public:__thiscall Adder :: Adder(int,int)”(?? 0Adder @@ QAE @ HH @ Z)在函数“public:void __thiscall UnitTest1 :: test :: add(void)”中引用( ?add @ test @ UnitTest1 @@ QAEXXZ)UnitTest1 C:\\ Users \\ Matt \\ documents \\ visual studio 2015 \\ Projects \\ addClass \\ UnitTest1 \\ unittest1.obj
LNK2019未解析的外部符号“public:__thiscall Adder :: ~Adder(void)”(?? 1Adder @@ QAE @ XZ)在函数“public:void __thiscall UnitTest1 :: test :: add(void)”中引用(?add @ test @ UnitTest1 @@ QAEXXZ)UnitTest1 C:\\ Users \\ Matt \\ documents \\ visual studio 2015 \\ Projects \\ addClass \\ UnitTest1 \\ unittest1.obj 1
LNK2019未解析的外部符号“public:int __thiscall Adder :: add(void)”(?add @ Adder @@ QAEHXZ)在函数“public:void __thiscall UnitTest1 :: test :: add(void)”中引用(?add @ test @ UnitTest1 @@ QAEXXZ)UnitTest1 C:\\ Users \\ Matt \\ documents \\ visual studio 2015 \\ Projects \\ addClass \\ UnitTest1 \\ unittest1.obj 1
我有一个类似的问题,但有一个应用程序类型项目(而不是DLL项目)。
对于未导出的测试项目中定义的类,您必须告知链接器测试器项目的实现位置。
即使在将测试项目添加为测试人员项目的参考之后,我还必须修改测试人员项目中的链接器选项,以包括实现被测试类的目标文件。
有关详细信息,请参阅使用Microsoft Unit Testing Framework for C ++编写C / C ++单元测试 。 特别是标题为“ 将测试链接到对象或库文件 ”的部分。
我从使用相同的链接器错误到拥有一个有效的测试环境。 如果通过“引用”测试项目的测试项目,它会很好,它会为你处理这类东西。
我也遇到了这个问题。 我找到了一些有用的东西,虽然我不确定是否是“正确的”解决方案。 一种选择是在单元测试类中包含.cpp文件和.h文件。 这非常难看。
第二个选项是右键单击单元测试项目,选择Add,然后选择Existing Item。 导航到出现的窗口浏览器中的.cpp文件,然后选择添加。 如果您不希望它们与您的单元测试源文件混合,您还可以创建一个用于存储这些源文件的新过滤器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.