我想使用Moq,但我使用的是Nhibernate而且我没有为我的所有Model类(POCO类)创建接口。
我是否必须为每个班级创建一个界面,以便我能够学习我的POCO课程?
答案 0 :(得分:8)
如果使用界面,可以模拟虚拟方法,但最佳。
我说这个原因如下:
var mockObject = new Mock<IMyObject>();
如果您使用虚拟方法,它将变为:
var mockObject = new Mock<MyObject>(params...);
您强制包含具体对象的参数,但您显然不需要接口。如果您决定在以后更改类的构造函数,则使用具体类的所有测试都需要更新。我过去一直被这个烧掉,所以尽量不再使用虚拟方法进行测试。
我应该通过尝试模拟具体类型来补充你正在挫败模拟框架的目的。你应该是mocking roles, not types。因此,在抽象中工作,在这种情况下,界面是一件很棒的事情。
另一个原因是接口如何工作,接口陈述合同而不是行为。当你有多个实现时应该使用它们,并且我将测试作为行为进行分类,因此是引入新接口的正当理由。
答案 1 :(得分:1)
您正在模拟的类/方法需要实现接口或是虚拟的。你可以测试任何类/方法,只要它可以访问,但没有办法模拟无法覆盖或明确实现的东西。