Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 模型单元测试能真正独立吗[ASP.NET MVC]_Asp.net Mvc_Unit Testing_Linq To Sql_Nunit - Fatal编程技术网

Asp.net mvc 模型单元测试能真正独立吗[ASP.NET MVC]

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生成它们),如果我想测试每个模型类,我必须构建模型类的一个对象,构建其每个依赖项的一个测试对象,将它们分配给对象的属性,然后在检查上下文并断言其实际工作之前持久化对象 这显然会使测试变得更加困难,因为这些测试彼此不依赖,或者不以特定的顺序运行(在我至少有一

我对整个单元测试都是新手,所以请原谅我缺乏经验。我读过很多资料,说任何测试都不应该依赖于其他测试,也就是说单元测试应该完全独立于其他测试。你真的能做到吗?我有下面的例子:我有几个相互依赖的实体类,基于某个数据库模式(我使用Linq-to SQL生成它们),如果我想测试每个模型类,我必须构建模型类的一个对象,构建其每个依赖项的一个测试对象,将它们分配给对象的属性,然后在检查上下文并断言其实际工作之前持久化对象

这显然会使测试变得更加困难,因为这些测试彼此不依赖,或者不以特定的顺序运行(在我至少有一个ContentType类型的实例之前,我没有要创建的Content类型的实例),至少在模型级别上存在依赖关系,并且无法避免

如果你认为我错了,请多多批评我。我想学习

顺便提一下,我正在开发一个ASP.NET MVC应用程序,并使用NUnit进行测试,如果这有意义的话

是的,单元测试应该(也可以)是独立的。您描述的问题与依赖性有关。应使用依赖注入框架解决依赖关系(请参见AutoFac,Ninject项目)

另一件事是应该使用模拟对象模拟数据库(请参见Moq,Rhino Mocks项目)。即使数据库断开连接,也需要测试所有代码


另一件事是,单元测试应该只测试一个功能,而不是整个流程。

您在这里描述的不是单元测试,而是集成测试。因为应用程序的数据模型与数据库紧密耦合,所以您的测试可能测试数据库功能,而不是“数据模型”

这是非常好的-请记住,集成测试需要设置(在您的案例数据库中),并且运行时间更长

您还可能有控制器的单元测试,这些测试可以与其他组件完全隔离,并且不需要数据库来运行,这些就是您提到的单元测试

如果您不测试实际的数据库功能,您可以使用fake/mock对象来替换外部类——事实上,使用初始MVC项目创建的测试有一个手动滚动的伪对象,可以完全实现这一点


“隔离”外部依赖关系的另一种方法是使用您自己的类扭曲Linq2Sql代码,并使用模拟框架伪造这些类调用。

是的,您实际上可以做到这一点

能够隔离每个单元的关键在于编写松散耦合的代码。依赖LINQtoSQL(L2S)类不是松散耦合的,这解释了您的问题


您最好定义一组可以隐藏L2S代码的接口。域模型然后在这些接口上工作,而不是直接在L2S类上工作。

你的意思是,我应该更好地测试控制器,或者如果我使用存储库模式,测试存储库,对吗?你应该测试(或多或少)所有或你的代码(每个单元是独立的),但是存储库模式是松耦合的一个很好的例子。这意味着您可以独立于具体存储库对控制器进行单元测试,并且在其他单元测试中,您可以测试具体存储库(而无需处理控制器)。