2012-05-25 4 views
6

는 다음과 같은 방법이 I :어떻게 Response.StatusCode를 Moq으로 조롱 할 수 있습니까?

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

그리고 다음 시험 : 여기 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; 
    } 

내가 테스트를 실행하면, 나는 다음과 같은 예외가 또한

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

입니다 :

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. 

Moq가 호출을 기대/호출해야하는 방식은 무엇입니까? SetHTTPStatusCode 메서드를 디버깅했습니다. 그러나 응답 개체는 실제로 조롱 된 개체입니다. 그러나 Moq에서는 호출이 없다고 주장합니다. 내가 놓친 게 있니?

감사합니다.

+0

은 어쩌면 당신은 HttpStatusCodeResult를 사용할 수 있을까? – archil

답변

18

당신의 TestHelpers.MakeHttpContext 방법이 무엇을 나타내지 않았기 때문에 무슨 일이 일어나고 있는지 이해하기가 어렵습니다. 이 같은

시도 :

// 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

대린, 답장을 보내 주셔서 감사합니다. 코드 샘플에 MakeHttpContext 메서드를 추가했습니다. 내가 주요 포인트, 즉 응답을위한 SetupGet을 치고있는 것 같습니다. 그러나, 나는 여전히 같은 문제를 겪고있다. –

+0

샘플을 사용해 보셨습니까? –

+0

예. 나는 또한 당신의 샘플을 시도했다. 나는 전체 샘플을 당신의 샘플로 대체했는데, 여전히 Moq와 같은 예외입니다. 차이가 있다면 Moq 4.0을 사용하고 있습니다. –

관련 문제