模拟一个微软 DLL

8

我有一个应用程序引用了一个微软DLL(Exchange Web Services)。在我的单元测试中,我想用Mock替换微软的DLL。

对于其他DLL有效的方法,在这个DLL上不起作用,因为我会得到一个异常

所定位的程序集清单定义与程序集引用不匹配

我验证了它具有相同的程序集版本,但我发现微软的DLL是数字签名的,所以它有一个PublicKeyToken。这可能是我的应用程序正在寻找的东西吗?一样被签名的DLL?

是否有一种方法可以引用DLL而无需其publickeytoken?

谢谢


1
怎么样:msvcr71d.dll太丑了,甚至rundll32.exe都说它有一个坏的图像!!!对吧?对吧?我很抱歉... - diceguyd30
1个回答

13

你不能模拟一个已签名的DLL。(如果你可以,那么你将被黑手党雇佣...)

模拟访问此dll中代码的代码。

创建一个facade(如果没有),包装对Exchange dll方法的访问。然后在你的测试中可以提供一个模拟facade。

通过facade / wrapper来保护你的代码免受任何第三方代码(程序集、Web服务、控件)的影响是一种良好的设计实践。这最小化了第三方代码更改的风险,例如升级到新版本的dll(所需的更改将仅影响facade),并有助于测试。


你可以通过一些技巧来模拟系统dll,例如PEX就是这样做的。 - oɔɯǝɹ
@remco - 你是在指 http://research.microsoft.com/en-us/projects/moles/ 吗? - Jakub Konecki
这实际上不起作用,因为你必须将一个Server实例传递给大多数方法。 - Nathan C. Tresch
@NathanC.Tresch - 你所说的“将Server实例传递给方法”是什么意思? - Jakub Konecki
@JakubKonecki 许多 Exchange Service 实用方法是通过将已实例化的 ExchangeService 传递给它们来使用的。您无法传递适配器或外观代替它,因此这种技术实际上并不适用于提问者的特定情况。 - Nathan C. Tresch
整个Facade的目的在于隐藏ExchangeService类,这样Facade的使用者就不需要知道它。 Facade的职责是实例化ExchangeService类,然后将该实例传递给任何Exchange Service实用程序方法所需的内容。这样,您就可以保护代码免受对Microsoft类的依赖。 - Jakub Konecki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接