VS2012本机单元测试因ZLib失败:“无法设置执行上下文”

时间:2013-07-15 15:33:39

标签: unit-testing visual-studio-2012 native zlib

向zlibwapi.lib添加链接依赖项会导致所有单元测试失败,并显示消息“无法设置执行上下文以运行测试”。遗憾的是,该消息未提供足够的详细信息来解决问题。了解无法设置测试执行上下文的原因非常有用,例如,由于some_reason无法加载some.dll。

其他帖子已经注意到所有依赖库必须位于同一目录中,但这并不能解决我的问题。 dumpbin.exe工具清楚地表明,向zlibwapi.lib添加链接依赖项只会将zlibwapi.dll添加到导入部分。此外,zlibwapi.dll的导入部分仅包含单元测试库的导入部分中已存在的KERNEL32.dll和MSVCR110D.dll。所有非标准依赖库都在单元测试运行时文件夹中,但仍然失败。

通过下载zlib,在Visual Studio 2012 SP3中构建它,以及添加本机单元测试,可以重现此问题。具体做法是:

  1. http://www.zlib.net下载zlib128.zip。

  2. 请按照以下提示(http://bugbeebox.com/2012/12/29/building-static-zlib-v1-2-7-with-msvc-2012/)在Visual Studio 2012上构建。

  3. 将名为zlibunittest的本机单元测试项目添加到... \ zlib-1.2.8 \ contrib \ vstudio \ vc11。在Build \ Configuration Manager中,为新项目添加x64位平台,验证它是否已选中Build复选框,并为活动解决方案平台选择x64。将zlibunittest中的项目依赖项添加到zlibvc以确保正确的构建顺序也很有用。

  4. 修改unittest1.cpp的TestMethod1,显示为:

    TEST_METHOD(TestMethod1)
    {
        Assert::AreEqual(0, 0);
    }
    

    设置测试 - >测试设置 - >默认处理器Achitecture到x64并验证它在test explorer中正确运行。

  5. 修改zlibunittest配置属性,如下所示:

    a)添加.. \ .. \ .. \ .. \;到C / C ++ - >一般 - >附加包含目录,因此可以找到zlib.h。 b)添加$(OutDir);链接器 - >一般 - >其他图书馆目录如此zlibwapi。*可以找到。 c)添加zlibwapi.lib;链接器 - >输入 - >额外的依赖关系。 d)添加副本.. \ x64 \ ZlibDllDebug \ zlibwapi。* $(OutDir)以构建事件 - >预构建事件,以便zlib运行时库与单元测试库二进制文件位于同一目录中。

  6. 修改unittest1.cpp的TestMethod1,显示为:

    TEST_METHOD(TestMethod1)
    {
        Assert::AreEqual(0, 0);
        gzopen(NULL, NULL);
    }
    

    gzopen的NULL args与此错误无关,因为它永远不会那么远。

  7. 在测试资源管理器中运行单元测试并获得一般错误“无法设置执行上下文以运行测试”。

  8. 现在,注释掉TestMethod1中的gzopen调用,并从其他链接器依赖项中删除zlibwapi.lib,并观察错误消失。

  9. 有谁知道如何使ZLib与Visual Studio 2012本机单元测试一起使用?

    至少,有没有人知道如何获得有关此特定错误的更多详细信息,即单元测试运行时日志?

1 个答案:

答案 0 :(得分:0)

事实证明,zlib有一个错误导致它需要Windows 8运行时。因此,显然在我的Windows 7开发机器上运行单元测试会导致神秘且不必要地隐藏“无法设置执行上下文”错误。

将此修复https://stackoverflow.com/a/17113126/2319854应用于zlib并重建所有内容后,单元测试再次开始工作。