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

时间:2017-03-15 22:59:24

标签: c# unit-testing moq xunit

我正在尝试模拟这个控制器:

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,并且发生错误,我怎么能模拟我的ActionContext和HttpContext进行测试?

1 个答案:

答案 0 :(得分:4)

您可以在安装程序等中构建_purchaseController。在你的情况下,你甚至不必嘲笑它。

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

但是如果您还要验证响应标头,则可能会模拟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
    }
}

然后你可以在测试中断言标题集合

var result = _sut.List();

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