ASP.NET:单元测试控制器失败,因为默认响应为 null [duplicate]

ASP.NET: Unit testing controller fails because default response is null [duplicate]

提问人:Zenith 提问时间:10/6/2021 更新时间:10/8/2021 访问量:713

问:

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

我的 NUnit 测试失败,因为在运行测试时,属性始终为 null。我的测试目前如下所示:ResponseController

[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 填充了 的实例,但 Response 是 ,因此无法自行设置。HttpDefaultResponsereadonly

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

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

C# asp.net ASP.NET-MVC 单元测试

评论


答:

0赞 Kami 10/6/2021 #1

不要使用该属性,而是通过以下方式创建自定义响应Response

var response = Request.CreateResponse(HttpStatusCode.Ok, result);

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

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

并返回此结果。

IActionResult rtn = ResponseMessage(response);
return rtn;

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

评论

0赞 Zenith 10/7/2021
这只会用响应请求来取代我的问题。请求也是只读的,所以嘲笑不是一种选择,因此给我留下了同样的问题。
2赞 Umair Malhi 1/2/2023
尽管这个问题在不同的地方有不同的答案,但我遇到了@Plank的这个解决方案(stackoverflow.com/a/55045637/5416602),它最适合我。向控制器提供真正的 HttpContext 可以解决请求和响应问题,而无需更改实际代码。_controller.ControllerContext.HttpContext = new DefaultHttpContext();