我正在尝试学习如何在带有C++的Visual Studio中使用单元测试。
我做了一个名为Adder
的 super 简单类,您可能会猜到,它添加了2个数字。
这是它的.h文件:
#ifndef ADDER
#define ADDER
class Adder {
private:
int num1, num2;
public:
Adder(int, int);
~Adder();
int add();
};
#endif
因此,我使用本机单元测试创建了一个新项目,并在其中引用了我的Adder项目。我无法仅使用
#include "adder.h"
包含.h文件,因此我不得不使用相对路径。我阅读了Microsoft's Tutorial,看来您必须使用这种路径。我的问题是我无法通过单元测试来识别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
,因为看起来Microsoft在他们的教程中没有。不过这没有用。我不确定如何获得单元测试来识别我的方法定义。万一我将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
最佳答案
我有一个类似的问题,但是有一个Application type项目(而不是DLL项目)。
对于未导出的被测试项目中定义的类,您必须告诉tester-project的链接器在何处实现。
即使在添加被测项目作为对tester-project的引用之后,我也不得不修改tester-project中的Linker选项,以包括实现被测类的对象文件。
有关详细信息,请参见Writing Unit tests for C/C++ with the Microsoft Unit Testing Framework for C++。特别是标题为“要将测试链接到对象或库文件”的部分。
我从遇到与您相同的链接器错误开始,转而使用了正常的测试环境。很好的是,通过“引用”测试人员项目中的待测项目,它可以为您处理这类事情。