Asp.net mvc 如何使用Response.StatusCode对控制器进行单元测试

Asp.net mvc 如何使用Response.StatusCode对控制器进行单元测试,asp.net-mvc,unit-testing,asp.net-mvc-5,Asp.net Mvc,Unit Testing,Asp.net Mvc 5,我在MVC5控制器上有一个方法:- [HttpPost] public JsonResult Save(TaskViewModel model) { if (ModelState.IsValid) { var task = model.ToTask(); _taskService.Save(task); return Json(task); } return Json(new ErrorViewModel(Mode

我在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);
    }
}
这导致我的单元测试失败,出现
System.NullReferenceException
,因为响应不存在

所以我的问题是,在这里,使控制器可测试和验证状态代码值的最佳实践是什么

更新
虽然这与此非常相似,但它并没有解决我试图返回JSON内容以及400状态代码的问题,请看一看。它详细解释了如何使用HttpContext和Response进行测试。

请使用“标记为重复”选项,而不是将指向另一个问题的链接作为答案发布。@cadrell0仅将其标记为重复如何帮助我获得答案?@baynezy It将您指向另一个有答案的问题。如果你的问题不是建议的问题的真实副本,那么请解释为什么它不同,这是你已经做过的。可能的副本我已经读过了那个问题。虽然这是非常接近。我想返回一个JSONResult和一个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));
}