2012-05-25 18 views
6

tengo el siguiente método:¿Cómo puedo simular el Response.StatusCode con Moq?

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

Y la siguiente prueba:

[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>()); 
    } 

Además, aquí es 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; 
    } 

Cuando ejecuto la prueba, me sale el siguiente excepción :

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. 

¿Cómo espera Moq/require que se invoquen las invocaciones? He depurado el método SetHTTPStatusCode, el objeto de respuesta es realmente un objeto burlado, sin embargo, Moq insiste en que no hubo invocación. ¿Me estoy perdiendo de algo?

Gracias!

+0

Tal vez usted podría utilizar HttpStatusCodeResult? – archil

Respuesta

18

No ha demostrado lo que hace su método TestHelpers.MakeHttpContext, por lo que es un poco difícil entender lo que está sucediendo.

Trate de esta manera:

// 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, gracias por la respuesta. Agregué el método MakeHttpContext al ejemplo de código. Parece que estoy alcanzando los puntos principales, es decir, el SetupGet for Response. Sin embargo, todavía tengo el mismo problema. –

+0

¿Has probado mi muestra? –

+0

Sí. También probé tu muestra. Reemplacé toda mi prueba con su muestra, sigue siendo la misma excepción de Moq. Estoy usando Moq 4.0 si eso hace la diferencia –

Cuestiones relacionadas