ASP.NET MVC单元测试控制器 - 存储库

时间:2010-05-27 14:41:24

标签: asp.net-mvc unit-testing mocking repository

这更像是一个征求意见的问题,所以可能没有一个“正确”的答案,但我欢迎有关为什么你的答案是“正确”答案的论据。

给定一个MVC应用程序,它使用实体框架来实现持久性引擎,存储库层,基本上遵循存储库的服务层,以及控制器上的删除方法,如下所示:

    public ActionResult Delete(State model)
    {
        try
        {
            if( model == null )
            {
                return View( model );
            }

            _stateService.Delete( model );

            return RedirectToAction("Index");
        }
        catch
        {
            return View( model );
        }
    }

我正在寻找正确的单元测试方法。目前,我有一个虚假的存储库,在服务中使用,我的单元测试如下所示:

    [TestMethod]
    public void Delete_Post_Passes_With_State_4()
    {
        //Arrange
        var stateService = GetService();
        var stateController = new StateController( stateService );

        ViewResult result = stateController.Delete( 4 ) as ViewResult;
        var model = (State)result.ViewData.Model;

        //Act
        RedirectToRouteResult redirectResult = stateController.Delete( model ) as RedirectToRouteResult;

        stateController = new StateController( stateService );

        var newresult = stateController.Delete( 4 ) as ViewResult;
        var newmodel = (State)newresult.ViewData.Model;

        //Assert
        Assert.AreEqual( redirectResult.RouteValues["action"], "Index" );
        Assert.IsNull( newmodel );
    }

这有多大意义吗?我是否需要检查记录是否实际被删除(因为我已经有服务和存储库测试来验证这一点)?我是否应该在这里使用虚假的存储库,或者仅仅模仿整个事情会更有意义吗?

我正在看的例子使用了这种做事模式,我只是复制了它,但我真的愿意以“最佳实践”的方式做事。

感谢。

2 个答案:

答案 0 :(得分:2)

我个人在那种情况下会使用虚假服务。

从你已经有服务测试的事情的声音,所以你不需要测试服务删除这里只是控制器。

至于你的其他测试,我会使用Fake Repository来测试服务层。至于测试存储库,我将有一个测试数据库设置来测试所有方法,并确保有一种方法可以将数据库设置回其原始设置,因此每次运行测试时都会对相同数据进行测试。

答案 1 :(得分:0)

我同意如果您在其他地方测试了其他图层等,则无需测试控制器。

我不同意上面的答案,因为我认为数据库不是测试的最佳方式。它比在内存列表等中使用要慢,但正如Simon所说,你需要编写清理代码以确保数据库返回中立状态。

这意味着您不太可能编写和运行测试。

ypou再次没有测试数据库。您正在测试您的控制器。