使用外部依赖项运行VC ++单元测试时,“无法设置执行上下文”

时间:2018-07-07 19:19:53

标签: c++ visual-studio unit-testing visual-c++

我有一个解决方案(可在this link的Git上获得),其中包括一个项目(生成DLL库)和一个本机单元测试。

  • 带有VC ++的Visual Studio Enterprise 2015
  • 在Windows 10上

我的解决方案的结构如下:

./src
+--DelaunayTriangulator.UnitTest
|  |--DelaunayTriangulatorTest.cpp
|  |--DelaunayTriangulator.UnitTest.vcxproj
+--DelaunayTriangulator
|  |--DelaunayTriangulator.cpp
|  |--DelaunayTriangulator.h
|  |--DelaunayTriangulator.vcxproj
|--Triangulator.sln

项目

我的源项目正常运行并且构建良好。它链接了一些库(AFAIK,它们基本上是静态库),而这些库只是我需要作为依赖项的CGAL东西。它也可以正常运行。

如果您查看project,您会发现我将这些.lib文件作为链接器选项的一部分进行了链接:

<Link>
      <AdditionalDependencies>$(CGALDirPath)\build\lib\Debug\CGAL-vc140-mt-gd-4.12.lib;$(CGALDirPath)\auxiliary\gmp\lib\libgmp-10.lib;$(CGALDirPath)\auxiliary\gmp\lib\libmpfr-4.lib;..</AdditionalDependencies>
      ...
</Link>

测试项目

已通过使用native test project演练和Visual Studio中的模板创建了单元测试项目。 test project还链接了与源项目相同的.lib文件。以下是我的单项测试:

#include "stdafx.h"
#include "CppUnitTest.h"

#include "../DelaunayTriangulator/DelaunayTriangulator.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;
using namespace CodeAlive::Triangulation;

namespace TriangulatorUnitTest {
    TEST_CLASS(DelaunayTriangulatorTest) {

    public:
        TEST_METHOD(PerformTriangulation) {
            DelaunayTriangulator* triangulator = new DelaunayTriangulator();
            int result = triangulator->Perform();

            Assert::AreEqual<int>(0, result, L"Wrong result", LINE_INFO());

            delete triangulator;
        }
    }; // class
} // ns

在我从CGAL链接这些.lib文件之前,该项目确实已构建,但根本没有运行,并显示以下错误消息:

  

消息:无法设置执行上下文以运行测试

错误

添加.lib文件后,仅当我未注释Assert行时,项目才构建并运行了单单元测试(我必须注释所有引用源代码的代码项目):

TEST_CLASS(DelaunayTriangulatorTest) {
public:
    TEST_METHOD(PerformTriangulation) {
        Assert::AreEqual<int>(0, 0, L"Wrong result", LINE_INFO());
    }
};

当我取消注释引用我的项目的代码(使用我在源项目中定义的类)时,然后在尝试运行测试时出现相同的错误消息:

TEST_CLASS(DelaunayTriangulatorTest) {
public:
    TEST_METHOD(PerformTriangulation) {
        DelaunayTriangulator* triangulator = new DelaunayTriangulator();
        int result = triangulator->Perform();

        Assert::AreEqual<int>(0, result, L"Wrong result", LINE_INFO());

        delete triangulator;
    }
};

我知道这是由于外部参考存在某种问题。怎么了

1 个答案:

答案 0 :(得分:0)

因此,这里的问题对我的配置来说有点特殊,但也足够通用,应该为在这种情况下可能引起的其他开发人员提供答案。

问题是我的源项目的.dll未部署到测试输出文件夹。因此,您需要在测试项目属性中设置OutDir

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
  <LinkIncremental>true</LinkIncremental>
  <OutDir>$(ProjectDir)$(Platform)\$(Configuration)\</OutDir>
</PropertyGroup>

这将使测试实际上将dll复制到解决方案文件夹中,而不是在测试项目文件夹中,然后将正确复制引用的源项目dll。测试项目文件没有OutDir的条目,似乎使MSBuild无法复制源工件。