嘲弄IoC容器?

时间:2011-04-22 23:59:52

标签: unit-testing mocking prism moq

模拟IoC容器是否有意义?如果是这样,我将如何使用Moq?

我正在使用Unity 2.0作为IoC容器创建一个Prism 4应用程序。我将容器注入需要其服务的类中,而不是使用Prism的ServiceLocator。对于单元测试,除非我需要其他Prism服务进行测试,否则我只需实例化容器并使用它注册模拟。我将容器传递给测试中的类,这样可以解决模拟问题。

这一切都相当简单,但我想知道我是否应该嘲笑容器?为什么?如果是这样,如果我使用Moq作为我的模拟框架,我该怎么做?谢谢你的帮助。

2 个答案:

答案 0 :(得分:10)

不,因为application classes should not reference a container at all来模拟DI容器没有意义。

您应该只注入他们需要的服务,而不是将容器注入到类中。这也意味着你可以unit test them without referencing a DI container at all

答案 1 :(得分:0)

我同意Mark Seemann的答案,一般来说99%的课程都可以正常使用。

有一些工厂类型类(可能是采用模型并将其转换为ViewModel的类,其中ViewModel具有依赖项),但这不起作用。在这些情况下,我通常接受容器的接口,而不是它的具体类型(在你的情况下是IUnityContainer)并像往常一样模拟。

public class MyWidgetFactory : IMyWidgetFactory
{
     public MyWidgetFactory(IUnityContainer container)
     {
          //...
     }
     public Widget[] GetWidgets()
     {
         //...
     }
}

public class MyWidgetFactoryConsumer
{
     private Widget[] _widgets;
     public MyWidgetFactoryConsumer(IMyWidgetFactory factory)
     {
          _widgets = factory.GetWidgets();
     }
}

上述两个类都是可测试的,工厂类需要具有IUnityContainer的模拟版本,而消费者只需要模拟工厂本身。