2012-05-25 15 views
6

Mam następujący sposób:Jak mogę sfałszować Response.StatusCode z Moq?

public void SetHttpStatusCode(HttpStatusCode httpStatusCode) 
    { 
     Response.StatusCode = (int)httpStatusCode; 
    } 

a następujący test:

[TestMethod] 
    public void SetHttpStatusCode_SetsCorrectStatusCode() 
    { 
     //Arrange 
     //Any url will suffice 
     var mockHttpContext = TestHelpers.MakeHttpContext(""); 
     mockHttpContext.SetupSet(x => x.Response.StatusCode = It.IsAny<int>()); 

     //creates an instance of an asp.net mvc controller 
     var controller = new AppController() 
     { 
     ControllerContext = new ControllerContext() { 
        HttpContext = mockHttpContext.Object } 
          }; 

     // Act 
     controller.SetHttpStatusCode(HttpStatusCode.OK); 

     //Assert 
     mockHttpContext.VerifySet(x => x.Response.StatusCode = It.IsAny<int>()); 
    } 

Również Oto MakeHttpContext

public static Mock<HttpContextBase> MakeHttpContext(string url) 
    { 
     var mockHttpContext = new Mock<HttpContextBase>(); 
     var mockRequest = new Mock<HttpRequestBase>(); 
     var mockResponse = new Mock<HttpResponseBase>(); 
     var mockSession = new Mock<HttpSessionStateBase>(); 

     //request 
     mockRequest.Setup(x => x.AppRelativeCurrentExecutionFilePath).Returns(url); 
     mockHttpContext.Setup(x => x.Request).Returns(mockRequest.Object); 

     //response 
     mockResponse.Setup(x => x.ApplyAppPathModifier(It.IsAny<string>())).Returns<string>(x => x); 
     mockHttpContext.Setup(x => x.Response).Returns(mockResponse.Object); 

     //session 
     mockHttpContext.Setup(x => x.Session).Returns(mockSession.Object); 

     return mockHttpContext; 
    } 

Kiedy wykonać test, otrzymuję następujący wyjątek :

Test method PA.Tests.Controllers.AppControllerTest.SetHttpStatusCode_SetsCorrectStatusCode 
threw exception: 


     Moq.MockException: 
     Expected invocation on the mock at least once, 
     but was never performed: x => x.StatusCode = It.IsAny<Int32>() 

     Configured setups: 
     x => x.StatusCode = It.IsAny<Int32>(), Times.Never 
     No invocations performed. 

W jaki sposób Moq oczekuje/wymaga wywoływania wywołań? Wcześniej debugowałem metodę SetHTTPStatusCode, obiekt odpowiedzi jest rzeczywiście wyśmianym obiektem, jednak Moq nalega, aby nie było inwokacji. Czy czegoś brakuje?

Dzięki!

+0

Być może można użyć HttpStatusCodeResult? – archil

Odpowiedz

18

Nie pokazałeś, co robi twoja metoda TestHelpers.MakeHttpContext, więc trochę trudno zrozumieć, co się dzieje.

Spróbuj tak:

// Arrange 
var mockHttpContext = new Mock<HttpContextBase>(); 
var response = new Mock<HttpResponseBase>(); 
mockHttpContext.SetupGet(x => x.Response).Returns(response.Object); 

//creates an instance of an asp.net mvc controller 
var controller = new AppController() 
{ 
    ControllerContext = new ControllerContext() 
    { 
     HttpContext = mockHttpContext.Object 
    } 
}; 

// Act 
controller.SetHttpStatusCode(HttpStatusCode.OK); 

//Assert 
response.VerifySet(x => x.StatusCode = (int)HttpStatusCode.OK); 
+0

Darin, dzięki za odpowiedź. Dodałem metodę MakeHttpContext do próbki kodu. Wygląda na to, że trafiam na najważniejsze punkty, a mianowicie SetupGet for Response. Jednak wciąż mam ten sam problem. –

+0

Czy próbowałeś mojej próbki? –

+0

Tak. Próbowałem również twojej próbki. Zastąpiłem cały test twoją próbką - wciąż ten sam wyjątek od Moq. Używam Moq 4.0, jeśli to robi różnicę. –

Powiązane problemy