这更像是一个征求意见的问题,所以可能没有一个“正确”的答案,但我欢迎有关为什么你的答案是“正确”答案的论据。
给定一个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 );
}
这有多大意义吗?我是否需要检查记录是否实际被删除(因为我已经有服务和存储库测试来验证这一点)?我是否应该在这里使用虚假的存储库,或者仅仅模仿整个事情会更有意义吗?
我正在看的例子使用了这种做事模式,我只是复制了它,但我真的愿意以“最佳实践”的方式做事。
感谢。
答案 0 :(得分:2)
我个人在那种情况下会使用虚假服务。
从你已经有服务测试的事情的声音,所以你不需要测试服务删除这里只是控制器。
至于你的其他测试,我会使用Fake Repository来测试服务层。至于测试存储库,我将有一个测试数据库设置来测试所有方法,并确保有一种方法可以将数据库设置回其原始设置,因此每次运行测试时都会对相同数据进行测试。
答案 1 :(得分:0)
我同意如果您在其他地方测试了其他图层等,则无需测试控制器。
我不同意上面的答案,因为我认为数据库不是测试的最佳方式。它比在内存列表等中使用要慢,但正如Simon所说,你需要编写清理代码以确保数据库返回中立状态。
这意味着您不太可能编写和运行测试。
ypou再次没有测试数据库。您正在测试您的控制器。