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

Joh*_*uru 7 c# asp.net-mvc unit-testing code-first

我只是想知道是否有一种方法可以在不使用Repository模式的情况下在MVC中对我的一些控制器Action进行单元测试.我已经开发了一个ASP.NET MVC站点,但是在初始阶段没有进行单元测试.现在我想向我的导师演示一些单元测试,可能是我的控制器中的两个或更多动作.我的大多数操作逻辑从数据库获取数据,一个控制器从不同的表中获取数据,即一个控制器中的操作从不同的表读取.我认为可以使用Generic Repository模式进行测试.作为初学者,我发现我只能对不是来自数据库的代码进行单元测试,但遗憾的是,我的控制器中的大部分代码都来自数据库.我正在使用Visual Studio中的默认测试工具和我的数据库的EF代码第一种方法.
例如,我想单独测试以下操作,而不必单元测试同一控制器中的其他操作.

public ActionResult Index()
    {
        var model = _db.PhotoGallery;
        return View(model);
    }
Run Code Online (Sandbox Code Playgroud)

这仅用于演示目的.

Str*_*ior 6

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

您的_db字段类型是接口吗?它是通过注射提供的吗?如果是这样,您可能会对此方法进行单元测试.


Bro*_*ass 5

如果不在控制器方法中删除对数据库的直接依赖性,则无法对这些方法进行单元测试.

建议的总体方法是使用IOC容器(例如Ninject)与MVC结合使用,允许您将所需的数据传递给控制器​​的构造函数."数据对象"不能绑定到数据库,通常它只是一个POCO对象或作为接口传递.

在单元测试中,您可以使用专为单元测试构建的内存数据对象替换这些依赖项,通常使用模拟框架(例如Rhino Mocks或Moq)进行" 模拟" .

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