2010-05-27 261 views
2

这是更多的意见寻求问题,所以可能没有“正确”的答案,但我会欢迎你为什么答案是“正确”的论点。ASP.NET MVC单元测试控制器 - 知识库

由于使用实体框架的持久化引擎的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); 
    } 

这是大材小用?我是否需要检查记录是否真的被删除(因为我已经有Service和Repository测试验证了这一点)?我是否应该在这里使用虚假的存储库,或者只是为了嘲笑整个事情会更有意义?

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

谢谢。

回答

2

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

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

至于你的其他测试,我会用一个虚拟库来测试服务层。至于测试版本库,我将有一个测试数据库设置来测试所有的方法,并确保有一种方法可以将数据库恢复到原始设置,所以每次运行测试时都要测试相同的数据。

+1

同意。如果此代码正在测试控制器,则服务和存储库应该是假货/存根。 – PatrickSteele 2010-05-27 15:16:01

0

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

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

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

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

+0

上面的海报指定他会使用测试数据库来测试实际的存储库代码。当然,你可以通过使用假名来测试大多数关卡,但是当涉及到真正测试存储库代码(实际与数据库对话的代码)时,测试它的唯一方法是让它实际与数据库进行交谈。如果你用一个假的代替仓库,那么你并没有真的测试仓库。你正在测试假... – 2010-06-10 22:07:53