嘲弄HttpResponeBase和HttpRequestBase时的问题

本文关键字:问题 HttpRequestBase HttpResponeBase 嘲弄 | 更新日期: 2023-09-27 18:10:41

我得到了一个mvc 3项目,我想模拟HttpResonseBase和HttpRequestBase。我使用RhinoMocks 3.6来模拟我的对象。我的测试代码现在看起来像这样。

[TestMethod]
public void Test()
{
    MockRepository repo = new MockRepositoy();
    HttpContextBase mockHttpContext= repo.StrictMock<HttpContextBase>();
    HttpRequestBase mockRequest = repo.StrictMock<HttpRequestBase>();
    HttpResponseBase mockResponse = repo.StrictMock<HttpResponseBase>();
    ICookie mockCookie = repo.StrictMock<ICookie>();
    Controller instanceToTest = new Controller(mockCookie);
    SetupResult.For(mockHttpContext.Request).Return(mockRequest);
    SetupResult.For(mockHttpContext.Response).Return(mockResponse);
    mocks.Replay(context);
    instanceToTest.ControllerContext = new ControllerContext(mockHttpContext, new RouteData(), instanceToTest);
    mockCookie.Expect(x=>x.MethodToExpect("Test",mockRequest,mockResponse);

    mockRepository.ReplayAll();
    instanceToTest.MethodToTest();
    mockRepository.VerifyAll();
}

当我运行测试时,我得到这个错误信息;

Rhino.Mocks.Exceptions.ExpectationViolationException: ICookie.MethodToExpect("Test", System.Web.HttpResponseBase, System.Web.HttpRequestBase); Expected #0, Actual #1.
ICookie.MethodToExpect("Test", HttpResponseBaseProxy); Expected #1, Actual #0.

我做错了什么?

嘲弄HttpResponeBase和HttpRequestBase时的问题

这里的问题是您使用了StrictMock—这意味着如果您在Mock对象上调用没有对其设置任何期望的方法,那么VerifyAllExpectations将失败。你可以用MockRepository.GenerateMock<T>法代替StrictMock法。
另一个评论是,你最好坚持使用RhinoMocks AAA语法(使用Expect, StubVerifyAllExpectations方法,而不是ReplayAll, SetupResult等…)
下面是使用纯AAA语法的代码:

[TestMethod]
public void Test()
{
    // Arrange(A) - create your objects, mocks and stubs
    // The context is a Stub - you just want it to return the mocked request and response
    HttpContextBase mockHttpContext= MockRepository.GenerateStub<HttpContextBase>();
    HttpRequestBase mockRequest = MockRepository.GenerateMock<HttpRequestBase>();
    HttpResponseBase mockResponse = MockRepository.GenerateMock<HttpResponseBase>();
    ICookie mockCookie = MockRepository.GenerateMock<ICookie>();
    Controller instanceToTest = new Controller(mockCookie);
    // Stub will return the mocked request and response on every call (similar to SetupResult)
    mockHttpContext.Stub(x => x.Request).Return(mockRequest);
    mockHttpContext.Stub(x => x.Response).Return(mockResponse);
    instanceToTest.ControllerContext = new ControllerContext(mockHttpContext, new RouteData(), instanceToTest);
    mockCookie.Expect(x=>x.MethodToExpect("Test",mockRequest,mockResponse);
    // Act(A) - do the actual operations on the tested class
    instanceToTest.MethodToTest();
    // Assert (A) - Verify your expectations
    mockCookie.VerifyAllExpectations();
}