2017-03-15 2 views
1

ich Mock versuche diesen Controller:Wie Mock Action mit Moq aspnetcore C# xUnit

public IActionResult List() 
{   

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

    return Ok(); 
} 

Mit diesem Test:

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

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

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

Aber meine Httpcontext null ist, und ein Fehler auftritt, wie könnte ich Mock mein ActionContext und HttpContext zum Testen?

Antwort

2

Sie könnten dies tun, wo Sie Ihren _purchaseController, in Ihrem Setup oder dergleichen konstruieren. In Ihrem Fall müssen Sie es nicht einmal verspotten.

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

Aber wenn Sie wollen auch die Antwort-Header, um überprüfen Sie wahrscheinlich sowohl die HttpContext und die erwartete HttpResponse verspotten würde, und geben Sie Ihre eigenen HeaderDictionary zu überprüfen.

_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 
    } 
} 

Dann könnten Sie die Header-Sammlung in einem Test Behaupten

var result = _sut.List(); 

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