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

问题描述 投票:0回答:1

我在 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 状态代码的问题

asp.net-mvc unit-testing asp.net-mvc-5
1个回答
0
投票

看看这个答案。它详细解释了如何使用 HttpContext 和 Response 进行测试。

© www.soinside.com 2019 - 2024. All rights reserved.