你如何模拟IUnityContainer?

时间:2009-03-16 16:05:55

标签: c# tdd mocking moq unity-container

我正在尝试使用Moq 3.0模拟IUnityContainer

我收到了BadImageFormatException,但在调试时却没有。从它的外观来看,我不是唯一遇到这个问题的人。

here

这是Moq的注册问题

here

我只是好奇是否有人找到了解决方案......我发现最接近的是一个很好的解决方案,使用Roy Osherove的RhinoMock

here

但我真的很喜欢Moq!所以我真的不想切换到Rhino Mock但是我必须

提前致谢!

5 个答案:

答案 0 :(得分:4)

你没有。

模仿容器的唯一原因是如果你传递它。这是一种反模式。

相反,您希望在应用程序的入口点或Composition Root组合整个对象图。

如果您需要动态创建实例,请使用Automatic Factories

对于测试,您可以构造测试对象并将模拟对象传递给构造函数,也可以在测试中创建一个新容器并使用它注册模拟对象。

答案 1 :(得分:1)

你需要一个完整的模拟对象吗?你能简单地实现假吗?即,实现IUnityContainer接口的测试实例化并覆盖需要与之交互的方法?

我不止一次陷入陷阱,因为我有一个模拟对象库,我应该用它来隔离系统中的每个依赖项。通常情况下,做一些更简单的事情会让我得到我想要的结果,而且挫折程度要低得多。

答案 2 :(得分:1)

你有没有尝试过模仿UnityBaseContainer或UnityContainer,而不是Rory Primrose的IUnityContainer,ala this post?他正在处理RhinoMocks,但因为我认为这个问题与Moq内部使用Castle有关,所以你可以用这种方式解决问题。

答案 3 :(得分:0)

由于这个问题,我不会模拟IUnityContainer,而是使用UnityContainer的实际实例。这不是理想的,但我可以通过检查容器是否可以根据需要解析类型来测试注册。

当您使用IServiceLocator来解析类中的类型时,可以模拟并使用{{1}},或者更好的是,使用容器注册工厂并使用它。

答案 4 :(得分:0)

你在Win x64上运行吗?看看这个page。它明确暗示。

  

当动态链接库(.dll文件)或可执行文件(.exe文件)的文件格式不符合公共语言运行库所期望的格式时,抛出此异常。

此外,发现此博客条目建议将编译标志从任何CPU更改为x86可能有助于此原因。 http://filips.net/archives/2008/01/17/getting-badimageformatexception-in-64-bit-windows/

修改:

另请查看this SO主题。也可以在Build Configuration Manager中查看。