单元测试失败,异常代码为c0000005

时间:2013-08-11 03:40:34

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

我正在尝试使用本机单元测试项目在Visual Studio 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或函数中可能声明的任何其他变量时,测试将失败。

我按照Unresolved externals when compiling unit tests for Visual C++ 2012

上的说明操作

2 个答案:

答案 0 :(得分:0)

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

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

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

在我这样做之后,我能够通过让它也引用.lib项目来轻松地使Native Unit Test项目工作,而且我从未遇到任何访问错误。

答案 1 :(得分:0)

这是known bug。不幸的是,微软认为这是"赢得了"。

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

  1. 在发布模式下编译实际项目,在调试模式下编译测试项目。
  2. 将所有可测试函数外包给静态库项目。