Search code examples
c++unit-testingoopvisual-studio-2019

C++ Unit Test in Visual Studio 2019


I am having a problem with Visual Studio 2019 CPPUnitTestFramework. I follow the instructions, but every time I get an error. I have looked for tutorials, but anything I get is for Visual Studio 2017 and it does not solve my problem.

I am writing a program that uses OOP in C++ and I want to make unit tests, since it is going to be a considerably long project. The problem that I am having is that the program is not compiling in the test module.

Consider that I have the code such that I have the header file:

//A.h
#pragma once
class A
{
private:
   // One parameter.
   int a;

public:

   // Add function.
   int add(int, int);

   // Subtract function.
   int subtract(int, int);

   A();
};

with the proper source file:

// A.cpp
#include "A.h"
int a;

int A::add(int alpha, int beta)
{
    return alpha + beta;
}

int A::subtract(int alpha, int beta)
{
    return alpha - beta;
}

A::A()
{
    a = 4;
}

The structure of the program looks something like this:

enter image description here

To make my Unit Test, I right click on the "Solution 'TestTestUnit'" label and choose new project, look for the unit test, add the unit test and attach the reference, such that I get a file structure such as the one below:

enter image description here

To perform the unit test I write the code:

// TestUnitForTestTestUnit.cpp
#include "pch.h"
#include "CppUnitTest.h"

#include "../TestTestUnit/A.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace TestUnitForTestTestUnit
{
   TEST_CLASS(TestUnitForTestTestUnit)
   {
   public:
    
      TEST_METHOD(TestMethod1)
      {
         A first;
         Assert::AreEqual(first.add(3, 2), 5);
      }
   };
}

When I try to run a test, the Test Explorer does nothing and throws the message: Aborting test run due to build failures. Please see the build for more details.

enter image description here

I cannot find the mistake here. The program runs perfect, but when instantiating a new "A" object the test fails. I am stuck here, are there any suggestions? What am I doing wrong (besides developing in Windows)?

UPDATE:

I have followed the suggestion to remove the namespace, as suggested by @ChrisMM, so that the test file now reads:

// TestUnitForTestTestUnit.cpp
#include "pch.h"
#include "CppUnitTest.h"

#include "../TestTestUnit/A.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

TEST_CLASS(TestUnitForTestTestUnit)
{
public:
    
   TEST_METHOD(TestMethod1)
   {
      A first;
      Assert::AreEqual(first.add(3, 2), 5);
   }
};

such that when I run the Test Explorer gives the same message:

enter image description here

with error message:

1>------ Build started: Project: TestUnitForTestTestUnit, Configuration: Debug Win32 ------
1>   Creating library C:\Users\<user>\Desktop\CPlusPlus\TestTestUnit\Debug\TestUnitForTestTestUnit.lib and object C:\Users\<user>\Desktop\CPlusPlus\TestTestUnit\Debug\TestUnitForTestTestUnit.exp
1>TestUnitForTestTestUnit.obj : error LNK2019: unresolved external symbol "public: int __thiscall A::add(int,int)" (?add@A@@QAEHHH@Z) referenced in function "public: void __thiscall TestUnitForTestTestUnit::TestMethod1(void)" (?TestMethod1@TestUnitForTestTestUnit@@QAEXXZ)
1>TestUnitForTestTestUnit.obj : error LNK2019: unresolved external symbol "public: __thiscall A::A(void)" (??0A@@QAE@XZ) referenced in function "public: void __thiscall TestUnitForTestTestUnit::TestMethod1(void)" (?TestMethod1@TestUnitForTestTestUnit@@QAEXXZ)
1>C:\Users\<user>\Desktop\CPlusPlus\TestTestUnit\Debug\TestUnitForTestTestUnit.dll : fatal error LNK1120: 2 unresolved externals
1>Done building project "TestUnitForTestTestUnit.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 0 skipped ==========

Help would be appreciated.


Solution

  • I suggest you to check if TestUnitForTestTestUnit has added Additional Dependencies. When I didn’t add it, the same problem as you occurred. After I added it, the program worked fine.

    Right click TestUnitForTestTestUnit->Properties->C/C++->Linker->Input->Additional Dependencies-> add ..\TestTestUnit\Debug\*.obj

    enter image description here