2017-03-15 26 views
1

我試圖模擬該控制器:如何模擬ActionContext中有起訂量aspnetcore C#的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來測試?

回答

2

你可以在你構建你的_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"]);