6

我正在尝试使用本机单元测试项目在 Visual Studios 2012 中创建单元测试。

这是我的测试:

TEST_METHOD(CalculationsRoundTests)
{
    int result = Calculations::Round(1.0);
    Assert::AreEqual(1, result);
}

导出类:

#ifdef EXPORT_TEST_FUNCTIONS
#define MY_CALCULATIONS_EXPORT __declspec(dllexport)
#else
#define MY_CALCULATIONS_EXPORT
#endif
...
class CALCULATIONS_EXPORT Calculations {
...
public:
static int Round(const double& x);

函数本身:

int Calculations::Round(const double& x)
{
    int temp;
    if (floor(x) + 0.5 > x)
        temp = floor(x);
    else
        temp = ceil(x);

    return int(temp);
}

但是,测试几乎总是以错误代码 c0000005(访问冲突)失败。第一次使用 x 或可能在函数中声明的任何其他变量时,测试将失败。

在为 Visual C++ 2012 编译单元测试时,我遵循了 Unresolved externals 中的说明

4

2 回答 2

1

这是一个已知的错误。不幸的是,微软认为这是“不会修复”。

简而言之,有两种解决方法:

  1. 在发布模式下编译实际项目,在调试模式下编译测试项目。
  2. 将所有可测试功能外包给静态库项目。
于 2015-05-14T13:07:03.000 回答
0

我从来没有弄清楚为什么测试在运行时会导致访问冲突;但是,我确定我设置了错误。

为了消除此错误,我更改了 Visual Studio 解决方案的结构,使大部分代码位于静态库 (.lib) 项目中,该项目将包含我的程序的实现。通过这样做,项目中我的程序的所有类和函数都会自动导出,所以我不需要使用__declspec(dllexport)。

然后,我创建了一个小型 Win32 控制台应用程序,它将为我的程序创建引用 .lib 项目的 .exe 文件。这个项目的目的是为我的程序创建可执行文件,所以它只需要一个 main 来调用我在 .lib 项目中的代码的开头。

在我这样做之后,我能够通过让 Native Unit Test 项目也引用 .lib 项目来轻松地工作,并且从那以后我没有任何访问错误。

于 2014-10-20T17:56:43.450 回答