2009-11-08 95 views
5

好吧,所以我一直试图最近进入IoC。但是,我一直遇到一个障碍 - 那就是我喜欢使用模拟对象。单元测试,模拟对象和ioc的最佳实践

他们快速和无痛的设置。然而,如果我在我的代码中使用IoC,那么它迫使我创建我的对象的测试实现(和配置)而不是使用模拟对象(即使用moq)。

最终的结果是我最终得到了用于测试的巨大配置文件。

另外,在测试中有很多场景,我需要在测试测试的基础上从我的课程中选出不同的行为。通过moq对象,这非常简单。你如何做与IoC类似的事情?

任何帮助将不胜感激。

谢谢,
迈克

+0

你能提供关于这个问题的更多信息吗?我不明白你是如何或为什么有问题。也许代码示例? – 2009-11-08 23:11:09

+0

如果你正在使用注入,你的类中的依赖通常应该注入到构造函数或属性中 - 所以在你的测试中,你应该拥有所有需要的接缝来替换被mock注入的东西。你能详细说明一个你正在努力的具体案例吗? – Mathias 2009-11-08 23:15:35

+0

为什么你在使用IOC容器进行单元测试? – mwjackson 2012-05-03 09:12:24

回答

5

国际奥委会应该使用模拟对象更容易,更轻松。

几个IoC容器框架将允许您定义预先存在的对象注入;与Moq你只是为myMockObject.Object设置它。

编辑:用mock配置Unity的实施例:

var mockService = new Mock<IMyService>(); 
container.RegisterInstance<IMyService>(mockService.Object); 

作为替代方案,可以只通过模拟对象进级的下测试(用于构造子注入)构造并绕过IoC容器完全在你的单元测试中。

编辑:乔希的答案是一个很好的例子。我通常会采用他的解决方案,而不是重新配置容器。

+0

不错,展示了如何使用IoC进行测试。我们最终不得不将自己的IoC与Web环境中的WCSF一起使用。这非常容易做到,并且最终成为理解依赖注入和IoC模式的极好练习。 – Josh 2009-11-08 23:31:11

3

我爱的IoC,我爱我一些Mock对象...

没有与这两个没有冲突。如果您正在进行任何类型的依赖注入,那么您应该只需使用您最喜欢的模拟框架创建模拟对象,然后将它们传递给SUT。

[Test] 
public void AnAwesomeTest() 
{ 
    IDependencyOne d1 = MyMocker.Create<IDependencyOne>(); 
    IDependencyTwo d2 = MyMocker.Create<IDependencyTwo>(); 

    //Constructor injection 
    SUT sut = new SUT(d1); 

    //Property Injection 
    sut.DependantProperty = d2; 

    //Do some stuff and Assert 
} 
+0

+1。请注意,它将是Moq的“新SUT(d1.Object)”。 – TrueWill 2009-11-08 23:26:04

+0

有趣。我习惯了RhinoMocks自己...如果语法不能解决这个问题。 – Josh 2009-11-08 23:27:48

+0

@Josh:一个区别是d1和d2的类型是Mock 。 Downside不得不做,以获取界面,上涨可以直接设定对d1和d2的预期。这是值得比较/对比的图书馆;他们有不同的哲学。前段时间我从Rhino转到Moq。 – TrueWill 2009-11-09 03:11:25