2011-08-30 92 views
1

在我的程序中,我使用SevenZipSharp生成zip文件。 SevenZipSharp是一个托管DLL,它加载另一个DLL,7z.dll。我使用SevenZipCompressor.SetLibraryPath手动设置SevenZipSharp的路径为7z.dll。在执行MS-Test测试时无法加载DLL

当我在调试模式下执行我的程序时,这一切都正常工作,它会生成你喜欢的zip文件。然而,当我执行我的单元测试MSTEST,SevenZipSharp总是给我下面的错误:

“试验方法抛出异常:SevenZip.SevenZipLibraryException:无法加载7-ZIP库或内部COM错误消息:加载失败图书馆..“

我怀疑MSTest可能会阻止SevenZipSharp能够加载7z.dll,就像在安全性较高的沙箱中运行一样(或者我是新来的C#和MSTest。 ..)

有没有人有关于可能发生什么的想法?

谢谢!

+1

什么,你是否也在设定路径?如果它是相对的,请将其更改为完全限定的路径名​​称。 – NotMe

回答

2

考虑使用优秀的SysInternals tools中的Process Monitor (aka procmon.exe)来监控您的测试设备(MSTest)。它会告诉你可执行文件在哪里查找7z.dll。

0

您确定要单元测试涉及外部库吗?理想情况下,您应该有机制来替换外部内容模拟对象,因为测试这样的外部库实际上会将测试转变为集成测试。

对于流行的库如SevenZipSharp,您可以假设它已经过正确测试,并且您可以进行手动集成测试以验证它在程序中的正确执行。

我会考虑通过依赖注入,嘲讽框架等来摆脱这种依赖关系,并让你的单元测试单独测试你自己的代码。

调查工厂方法或抽象工厂设计模式,了解如何轻松替换这些依赖关系的提示。

一个好的开始是创建自己的ICustomZipInterface,并使用包装模式来封装生产代码的zip逻辑。在你的单元测试中,用一个虚拟实现替换该包装类。例如,虚拟实现可能会记录您如何访问您的zip组件,并且您可以使用该信息来验证您的代码,而不是检查是否实际创建了一个zip文件。

2

虽然这个问题提出了一个值得怀疑的方案,但是MSTest不加载所需的DLL的一般问题似乎是一个常见问题,值得一个不屑一顾的答案。

  1. 默认MSTest的会复制它认为通过测试容器必须默认的结果文件夹的输出文件夹,从而改变每次运行的组件。

  2. MSTest并不总是自动正确推断必要的组件;如果没有明确的直接引用程序集,它将不会被复制。此外,通常不会检测本机DLL。

  3. 我不知道一个直接选项设置MSTest的搜索路径。您可以使用procmon确定搜索路径。如上所示(这基本上是标准的Windows DLL搜索)。

  4. 不直观的是,默认搜索路径不包括启动目录,我认为这是造成混淆的原因。当测试运行时,当前目录是测试结果“Out”目录,而不是MSTest启动目录。

然而,可能有测试设置文件控制MSTest的搜索行为(和复制行为)。您可以通过Visual Studio轻松创建和编辑这些文件(请参阅测试菜单),然后在MSTest命令行上指定创建的设置文件。您可以为Visual Studio和MSTest使用不同的设置文件。

通过这种方式,您可以准确控制将哪些DLL复制到您的测试目录。 请参阅Create Test Settings to Run Automated Tests from Visual Studio以获取更多信息。

当然,DLL加载失败可能是由于缺少依赖关系,并且错误消息中提到的DLL可能存在本身。您可以使用依赖查看器或procmon来获取DLL中的意外依赖关系。

0

的Visual Studio 2017年(也可能是2015年)提供了两种新的方式来表明本机DLL或其他文件是由您的测试要求,而不需要一个测试设置文件:

1:将链接添加到DLL到您的测试项目,并告诉VS将其复制到输出目录。在Solution Explorer中右键单击该项目,然后选择Add> Existing Item。浏览到7z.dll,单击添加按钮旁边的向下箭头,然后选择添加为链接。然后在解决方案资源管理器中选择新的7z.dll项目,alt-Enter调出属性,并将“Copy to Output Directory”设置为“Copy if newer”(或“Copy always”)。

2:将DeploymentItemAttribute附加到您的测试类。此属性的构造函数接受一个字符串参数,该参数是要在类中提供给测试的文件的路径。它与测试项目的输出目录相关。