Asp.net mvc 模型单元测试能真正独立吗[ASP.NET MVC]
我对整个单元测试都是新手,所以请原谅我缺乏经验。我读过很多资料,说任何测试都不应该依赖于其他测试,也就是说单元测试应该完全独立于其他测试。你真的能做到吗?我有下面的例子:我有几个相互依赖的实体类,基于某个数据库模式(我使用Linq-to SQL生成它们),如果我想测试每个模型类,我必须构建模型类的一个对象,构建其每个依赖项的一个测试对象,将它们分配给对象的属性,然后在检查上下文并断言其实际工作之前持久化对象 这显然会使测试变得更加困难,因为这些测试彼此不依赖,或者不以特定的顺序运行(在我至少有一个ContentType类型的实例之前,我没有要创建的Content类型的实例),至少在模型级别上存在依赖关系,并且无法避免 如果你认为我错了,请多多批评我。我想学习 顺便提一下,我正在开发一个ASP.NET MVC应用程序,并使用NUnit进行测试,如果这有意义的话是的,单元测试应该(也可以)是独立的。您描述的问题与依赖性有关。应使用依赖注入框架解决依赖关系(请参见AutoFac,Ninject项目) 另一件事是应该使用模拟对象模拟数据库(请参见Moq,Rhino Mocks项目)。即使数据库断开连接,也需要测试所有代码Asp.net mvc 模型单元测试能真正独立吗[ASP.NET MVC],asp.net-mvc,unit-testing,linq-to-sql,nunit,Asp.net Mvc,Unit Testing,Linq To Sql,Nunit,我对整个单元测试都是新手,所以请原谅我缺乏经验。我读过很多资料,说任何测试都不应该依赖于其他测试,也就是说单元测试应该完全独立于其他测试。你真的能做到吗?我有下面的例子:我有几个相互依赖的实体类,基于某个数据库模式(我使用Linq-to SQL生成它们),如果我想测试每个模型类,我必须构建模型类的一个对象,构建其每个依赖项的一个测试对象,将它们分配给对象的属性,然后在检查上下文并断言其实际工作之前持久化对象 这显然会使测试变得更加困难,因为这些测试彼此不依赖,或者不以特定的顺序运行(在我至少有一
另一件事是,单元测试应该只测试一个功能,而不是整个流程。您在这里描述的不是单元测试,而是集成测试。因为应用程序的数据模型与数据库紧密耦合,所以您的测试可能测试数据库功能,而不是“数据模型” 这是非常好的-请记住,集成测试需要设置(在您的案例数据库中),并且运行时间更长 您还可能有控制器的单元测试,这些测试可以与其他组件完全隔离,并且不需要数据库来运行,这些就是您提到的单元测试 如果您不测试实际的数据库功能,您可以使用fake/mock对象来替换外部类——事实上,使用初始MVC项目创建的测试有一个手动滚动的伪对象,可以完全实现这一点
“隔离”外部依赖关系的另一种方法是使用您自己的类扭曲Linq2Sql代码,并使用模拟框架伪造这些类调用。是的,您实际上可以做到这一点 能够隔离每个单元的关键在于编写松散耦合的代码。依赖LINQtoSQL(L2S)类不是松散耦合的,这解释了您的问题
您最好定义一组可以隐藏L2S代码的接口。域模型然后在这些接口上工作,而不是直接在L2S类上工作。你的意思是,我应该更好地测试控制器,或者如果我使用存储库模式,测试存储库,对吗?你应该测试(或多或少)所有或你的代码(每个单元是独立的),但是存储库模式是松耦合的一个很好的例子。这意味着您可以独立于具体存储库对控制器进行单元测试,并且在其他单元测试中,您可以测试具体存储库(而无需处理控制器)。