Проблемы при издевательстве над HttpResponeBase и HttpRequestBase - PullRequest
0 голосов
/ 07 октября 2011

У меня есть проект 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.

Что я делаю не так?

1 Ответ

5 голосов
/ 07 октября 2011

Проблема здесь в том, что вы используете StrictMock - это означает, что если вы вызываете метод объекта Mock, который вы не установили для него никаких ожиданий, VerifyAllExpectations завершится неудачей. Вы можете использовать MockRepository.GenerateMock<T> метод вместо StrictMock.
Еще один комментарий заключается в том, что вам лучше придерживаться синтаксиса RhinoMocks AAA (используя методы Expect, Stub и VerifyAllExpectations вместо 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();
}
...