gpt4 book ai didi

c# - 如何使用 Moq aspnetcore C# xUnit 模拟 ActionContext

转载 作者:行者123 更新时间:2023-11-30 14:48:00 27 4
gpt4 key购买 nike

我正在尝试模拟这个 Controller :

public IActionResult List()
{

Response.Headers.Add("contentRange", "1");
Response.Headers.Add("acceptRange", "1");

return Ok();
}

通过这个测试:

[Fact]
public void when_call_list_should_return_sucess()
{
//Arrange

//Act
var result = _purchaseController.List();

//Assert
Assert.Equal(200, ((ObjectResult)result).StatusCode);
}

但是我的HttpContext是null,报错了,怎么mock我的ActionContext和HttpContext来测试呢?

最佳答案

您可以在您构建 _purchaseController 的地方、在您的设置中或类似的地方执行此操作。在您的情况下,您甚至不必 mock 它。

_purchaseController = new PurchaseController
{
ControllerContext = new ControllerContext
{
HttpContext = new DefaultHttpContext()
}
}

但如果您还想验证响应 header ,您可能会同时模拟 HttpContext 和预期的 HttpResponse,并提供您自己的 HeaderDictionary 验证。

_headers = new HeaderDictionary();

var httpResponseMock = new Mock<HttpResponse>();
httpResponseMock.Setup(mock => mock.Headers).Returns(_headers);

var httpContextMock = new Mock<HttpContext>();
httpContextMock.Setup(mock => mock.Response).Returns(httpResponseMock.Object);

_purchaseController = new PurchaseController
{
ControllerContext = new ControllerContext
{
HttpContext = httpContextMock.Object
}
}

然后您可以在测试中断言 header 集合

var result = _sut.List();

Assert.Equal("1", _headers["contentRange"]);
Assert.Equal("1", _headers["acceptRange"]);

关于c# - 如何使用 Moq aspnetcore C# xUnit 模拟 ActionContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42822293/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com