模拟IoC容器是否有意义?如果是这样,我将如何使用Moq?
我正在使用Unity 2.0作为IoC容器创建一个Prism 4应用程序。我将容器注入需要其服务的类中,而不是使用Prism的ServiceLocator
。对于单元测试,除非我需要其他Prism服务进行测试,否则我只需实例化容器并使用它注册模拟。我将容器传递给测试中的类,这样可以解决模拟问题。
这一切都相当简单,但我想知道我是否应该嘲笑容器?为什么?如果是这样,如果我使用Moq作为我的模拟框架,我该怎么做?谢谢你的帮助。
答案 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的模拟版本,而消费者只需要模拟工厂本身。