【问题标题】:ASP.NET: Unit testing controller fails because default response is null [duplicate]ASP.NET:单元测试控制器失败,因为默认响应为空 [重复]
【发布时间】:2021-10-06 12:55:22
【问题描述】:

我正在尝试对控制器进行单元测试。 SomeController 继承自 BaseControllerBaseController 继承自 Microsoft.AspNetCore.Mvc.Controller

我的 NUnit 测试失败,因为在运行我的测试时,Controller 中的属性 Response 始终为空。我的测试目前看起来像这样:

[Test]
public void GetByFilter_ShouldReturnABadRequest_WhenModelStateIsInvalid()
{
    _sut.ModelState.AddModelError("SessionName", "Required");
    var result = _sut.GetByFilter(_mockedFilter);
    Assert.IsAssignableFrom<BadRequestObjectResult>(result);
}

_sut[SetUp] 使用此方法设置:

protected override void InitSut() => _sut =
        new SomeController(_mockedLogger, _mockedService, _mockedRepository, _mockedHtmlSanitizer);

测试失败但运行正常的代码如下所示:

Response.Headers.Add("RowCount", result.Count().ToString());
return Ok(result);

似乎我需要做一些事情让 BaseController 设置响应。在生产中,Response 填充了 HttpDefaultResponse 的实例,但 Response 是 readonly,所以我自己无法设置。

我尝试过像这样的测试指南,但没有运气:
https://docs.microsoft.com/en-us/aspnet/web-api/overview/testing-and-debugging/unit-testing-controllers-in-web-api

我需要做什么才能正确启动控制器并通过测试?

【问题讨论】:

    标签: c# asp.net asp.net-mvc unit-testing


    【解决方案1】:

    与其使用Response 属性,不如通过

    创建自定义响应
    var response = Request.CreateResponse(HttpStatusCode.Ok, result);
    

    然后你可以根据需要添加标题

    response.Headers.Add("RowCount", result.Count().ToString());
    

    并将其作为结果返回。

    IActionResult rtn = ResponseMessage(response);
    return rtn;
    

    您可能需要在单元测试中设置或模拟 Request 对象。

    【讨论】:

    • 这只会用响应请求代替我的问题。请求也是只读的,所以模拟不是一种选择,因此给我留下了同样的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多