Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.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
C# 如何在不使用存储库模式的情况下对ASP.NET MVC控制器进行单元测试_C#_Asp.net Mvc_Unit Testing_Code First - Fatal编程技术网

C# 如何在不使用存储库模式的情况下对ASP.NET MVC控制器进行单元测试

C# 如何在不使用存储库模式的情况下对ASP.NET MVC控制器进行单元测试,c#,asp.net-mvc,unit-testing,code-first,C#,Asp.net Mvc,Unit Testing,Code First,我只是想知道是否有一种方法可以对我的一些控制器进行单元测试 不使用存储库模式的MVC。我开发了一个ASP.NETMVC站点,但在初始阶段没有进行单元测试。现在,我想向我的导师演示一些单元测试,使用控制器中的两个或更多操作。我的大多数操作逻辑从数据库获取数据,一个控制器从不同的表获取数据,即一个控制器中的操作从不同的表读取。我认为可以使用通用存储库模式对其进行测试。作为一个初学者,我发现我只能对一个不是来自数据库的代码进行单元测试,但不幸的是,我的控制器操作中的大多数代码都来自数据库。我正在使用v

我只是想知道是否有一种方法可以对我的一些控制器进行单元测试 不使用存储库模式的MVC。我开发了一个ASP.NETMVC站点,但在初始阶段没有进行单元测试。现在,我想向我的导师演示一些单元测试,使用控制器中的两个或更多操作。我的大多数操作逻辑从数据库获取数据,一个控制器从不同的表获取数据,即一个控制器中的操作从不同的表读取。我认为可以使用通用存储库模式对其进行测试。作为一个初学者,我发现我只能对一个不是来自数据库的代码进行单元测试,但不幸的是,我的控制器操作中的大多数代码都来自数据库。我正在使用visual Studio中的默认测试工具和数据库的EF代码优先方法。
例如,我只想对以下操作进行单元测试,而不必对同一控制器中的其他操作进行单元测试

public ActionResult Index()
    {
        var model = _db.PhotoGallery;
        return View(model);
    }

这只是为了演示。

根据定义,单元测试应该只影响它调用的方法。如果您可以找到一种方法来模拟_db对象,这样实际上就不会导致数据库往返,那么您可以对依赖它的方法进行单元测试。否则,不会


您的
\u db
字段的类型是接口吗?是否通过注射提供?如果是这样,您很可能可以对该方法进行单元测试。

如果不删除控制器方法中对数据库的直接依赖关系,您将无法对这些方法进行单元测试

推荐的总体方法是使用IOC容器(例如)与MVC相结合,允许您将所需的数据传递给控制器的构造函数。“数据对象”不能绑定到数据库,通常它要么只是一个POCO对象,要么作为接口传递

然后,在单元测试中,您可以使用仅为单元测试构建的内存中数据对象替换这些依赖项,通常使用模拟框架(例如Rhino Mock或)


使用这种方法,您不仅可以使控制器单元可测试,而且最终会得到非常松散耦合的代码,这一好处可能会为以后的开发带来回报。

这就是所谓的可测试的
代码:)
当您执行单元测试时,您需要确保测试失败的唯一原因是SUT(被测系统或被测类)实现中的更改。当然,当依赖项API发生变化时,它可能会被破坏(没关系,您应该修改SUT以使用新的API),但如果依赖项实现发生变化,它永远不会失败。这就是为什么要使用嘲弄和存根

但如果您想模拟依赖关系,就不应该在SUT内部创建它。它应该被注入SUT(构造函数,参数注入的属性)

那么,回到你的情况:

  • 如果您想拥有可测试类,就必须注入依赖项(db)
  • 依赖性应该被模仿
  • 您不必强制使用存储库模式。如果您可以模拟db类,只需模拟它即可。或者使用任何其他数据访问抽象