我正在尝试使用Moq 3.0模拟IUnityContainer
我收到了BadImageFormatException,但在调试时却没有。从它的外观来看,我不是唯一遇到这个问题的人。
这是Moq的注册问题
我只是好奇是否有人找到了解决方案......我发现最接近的是一个很好的解决方案,使用Roy Osherove的RhinoMock
但我真的很喜欢Moq!所以我真的不想切换到Rhino Mock但是我必须
提前致谢!
答案 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中查看。