我在 MVC5 控制器上有一个方法:-
[HttpPost]
public JsonResult Save(TaskViewModel model)
{
if (ModelState.IsValid)
{
var task = model.ToTask();
_taskService.Save(task);
return Json(task);
}
return Json(new ErrorViewModel(ModelState));
}
我很高兴像这样进行单元测试:-
[Test]
public void Save_WhenInvalidModel_ThenDoNotCallITaskServiceSave()
{
var model = new TaskViewModel();
var service = new Mock<ITaskService>();
service.Setup(m => m.Save(It.IsAny<Task>()));
var controller = CreateController(service.Object);
ValidateModel(model, controller);
controller.Save(model);
service.Verify(f => f.Save(It.IsAny<Task>()), Times.Never());
}
protected static void ValidateModel(object model, Controller controller)
{
var validationContext = new ValidationContext(model, null, null);
var validationResults = new List<ValidationResult>();
Validator.TryValidateObject(model, validationContext, validationResults);
foreach (var validationResult in validationResults)
{
controller.ModelState.AddModelError(validationResult.MemberNames.First(), validationResult.ErrorMessage);
}
}
但是,我需要让这个方法返回400状态码并返回内容。所以我对控制器方法做了以下更改。
[HttpPost]
public JsonResult Save(TaskViewModel model)
{
if (ModelState.IsValid)
{
var task = model.ToTask();
_taskService.Save(task);
return Json(task);
}
Response.StatusCode = 400;
Response.TrySkipIisCustomErrors = true;
return Json(new ErrorViewModel(ModelState));
}
这会导致我的单元测试失败,并显示
System.NullReferenceException
,因为响应不存在。
所以我的问题是,使该控制器可测试并验证状态代码值的最佳实践是什么?
更新 虽然这与 MVC3 单元测试响应代码非常相似,但它并没有解决我试图返回 JSON 内容以及 400 状态代码的问题
看看这个答案。它详细解释了如何使用 HttpContext 和 Response 进行测试。