我正在尝试学习如何在带有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++。特别是标题为“要将测试链接到对象或库文件”的部分。

我从遇到与您相同的链接器错误开始,转而使用了正常的测试环境。很好的是,通过“引用”测试人员项目中的待测项目,它可以为您处理这类事情。

10-07 13:43