【问题标题】:ASP.NET MVC Unit Testing Controllers - RepositoriesASP.NET MVC 单元测试控制器 - 存储库
【发布时间】:2010-05-27 14:41:24
【问题描述】:

这更像是一个征求意见的问题,因此可能没有“正确”的答案,但我欢迎您就为什么您的答案是“正确”的答案提出争论。

给定一个使用 Entity Framework 作为持久性引擎的 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 );
    }

这是矫枉过正吗?我是否需要检查记录是否真的被删除(因为我已经有服务和存储库测试来验证这一点)?我应该在这里使用一个假的存储库还是仅仅模拟整个事情更有意义?

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

    从事物的声音来看,您已经进行了服务测试,因此您无需在此处仅测试控制器的服务删除。

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

    【讨论】:

    • 同意。如果此代码正在测试控制器,那么服务和存储库应该是假货/存根。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 上面的发帖人指定他将使用一个测试数据库来测试实际的存储库代码。当然,您可以使用假货来测试大多数关卡,但是在实际测试您的存储库代码(实际与您的数据库对话的代码)时,测试它的唯一方法是让它与您的数据库实际对话。如果您用假的替换存储库,那么您并没有真正测试存储库。你在测试假货……
    猜你喜欢
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多