对我来说使用Moq,我的所有类都必须实现一个接口吗?

时间:2009-12-25 19:40:16

标签: unit-testing nhibernate nunit moq

我想使用Moq,但我使用的是Nhibernate而且我没有为我的所有Model类(POCO类)创建接口。

我是否必须为每个班级创建一个界面,以便我能够学习我的POCO课程?

2 个答案:

答案 0 :(得分:8)

如果使用界面,可以模拟虚拟方法,但最佳

我说这个原因如下:

var mockObject = new Mock<IMyObject>();

如果您使用虚拟方法,它将变为:

var mockObject = new Mock<MyObject>(params...);

强制包含具体对象的参数,但您显然不需要接口。如果您决定在以后更改类的构造函数,则使用具体类的所有测试都需要更新。我过去一直被这个烧掉,所以尽量不再使用虚拟方法进行测试。

我应该通过尝试模拟具体类型来补充你正在挫败模拟框架的目的。你应该是mocking roles, not types。因此,在抽象中工作,在这种情况下,界面是一件很棒的事情。

另一个原因是接口如何工作,接口陈述合同而不是行为。当你有多个实现时应该使用它们,并且我将测试作为行为进行分类,因此是引入新接口的正当理由。

答案 1 :(得分:1)

您正在模拟的类/方法需要实现接口或是虚拟的。你可以测试任何类/方法,只要它可以访问,但没有办法模拟无法覆盖或明确实现的东西。