我是整个单元测试的新手,所以请原谅我缺乏经验。我读了很多材料说没有测试应该依赖别人去做,即单元测试完全是彼此独立的。你真的能在现实中做到吗?我有以下示例:我有一些实体类相互依赖,基于某个数据库模式(我使用Linq-to SQL生成它们)现在,如果我想测试每个模型类,我必须构建模型类的一个对象,构建每个依赖项的测试对象,将它们分配给对象的属性,然后在检查上下文并断言它实际工作之前保留该对象。
这显然使得更难以进行彼此不依赖的测试,或者不按特定顺序运行(在我至少有一个ContentType类型的实例之前,我没有创建Content类型的实例)依赖性,至少在模型级别上存在且无法避免。
如果你认为我错了,请批评我。我想学习。
P.S。只是要提一下,我正在开发一个ASP.NET MVC应用程序并使用NUnit进行测试(如果这是有意义的)
答案 0 :(得分:2)
是,你实际上可以做到这一点。
能够隔离每个单元的关键是编写松散耦合代码。依赖于LINQ to SQL(L2S)类并没有松散耦合,这解释了您的问题。
最好定义一组可以隐藏L2S代码的接口。然后,域模型可以在这些接口上工作,而不是直接在L2S类上工作。
答案 1 :(得分:1)
是的,单元测试应该(并且可以)独立。您描述的问题是依赖性。应使用依赖注入框架来解决依赖关系(请参阅AutoFac,Ninject项目)。
另一件事是你的数据库应该使用模拟对象进行模拟(参见Moq,Rhino Mocks项目)。即使数据库被删除,您也需要测试所有代码。
其他的事情是,单元测试应该只测试一个功能而不是所有过程。
答案 2 :(得分:1)
您在此处描述的不是单元测试,而是集成测试。由于应用程序的数据模型与数据库紧密耦合,因此测试可能会测试数据库功能而不是“数据模型”。
这非常好 - 请记住,集成测试需要设置(在您的案例数据库中)并需要更长时间才能运行。
您也可能对控制器进行单元测试,可以与其他组件完全隔离,不需要运行数据库,这些是您所谈论的单元测试。
如果你不测试实际的数据库功能,你可以使用假/模拟对象来替换外部类 - 事实上,使用初始MVC项目创建的测试有一个手动滚动的虚假对象就是这样做。
“隔离”外部依赖项的另一种方法是使用自己的类来扭曲Linq2Sql代码,并使用Mocking框架伪造这些类调用。