10

私は次の方法を持っています:

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

そして、次のテスト:

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

また、ここに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;
    }

テストを実行すると、次の例外が発生します。

    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は呼び出しがなかったと主張しています。私は何かが足りないのですか?

ありがとう!

4

1 に答える 1

21

あなたはあなたの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);
于 2012-05-25T14:10:33.963 に答える