Search code examples
c#asp.net-mvcrhino-mocks

Rhino mocks of properties property


When I do these two lines after each other my code fails with Previous method 'HttpContextBase.get_Request();' requires a return value or an exception to throw. on the second line.

context.Expect(c => c.Request.UrlReferrer).Return(uri).Repeat.Any();
context.Expect(c => c.Request.HttpMethod).Return("POST").Repeat.Any();

However when I do just one of the rows the code runs fine.

Doing the following does not fix the problem.

context.Expect(c => c.Request).Return(request);

Anyone understands this strange behaviour?

Thanks,
Drutten

Edit: Entire code is:

public static class Extensions
{
    public static HttpContextBase FakeHttpContext()
    {
        var context = MockRepository.GenerateMock<HttpContextBase>();
        var request = MockRepository.GenerateMock<HttpRequestBase>();
        var response = MockRepository.GenerateMock<HttpResponseBase>();
        var session = MockRepository.GenerateMock<HttpSessionStateBase>();
        var server = MockRepository.GenerateMock<HttpServerUtilityBase>();
        var writer = new StringWriter();

        var form = new NameValueCollection();
        request.Expect(r => r.Form).Return(form);

        var uri = new Uri("http://localhost/IntegrationTests");
        request.Expect(r => r.UrlReferrer).Return(uri).Repeat.Any();

        var queryString = new NameValueCollection();
        request.Expect(r => r.QueryString).Return(queryString);

        context.Expect(c => c.Request).Return(request).Repeat.Any();
        context.Expect(c => c.Request.UrlReferrer).Return(uri).Repeat.Any();
        context.Expect(c => c.Request.HttpMethod).Return("POST").Repeat.Any();
        context.Expect(c => c.Response).Return(response);
        context.Expect(c => c.Session).Return(session);
        context.Expect(c => c.Server).Return(server);
        context.Expect(c => c.Items).Return(new Dictionary<object, object>());

        response.Expect(c => c.Output).Return(writer);

        return context;
    }

    public static void MockControllerContext(this Controller controller)
    {
        var httpContext = FakeHttpContext();

        var routeData = new RouteData();
        routeData.Values.Add("controller", "Home");
        routeData.Values.Add("action", "Index");

        controller.ControllerContext = new ControllerContext(new RequestContext(httpContext, routeData), controller);
    }
}

Solution

  • I fixed the problem. The problem was probably related to the mix of

    context.Expect(c => c.Request.UrlReferrer).Return(uri).Repeat.Any();  
    

    and

    context.Expect(c => c.Request).Return(request).Repeat.Any();
    

    Working code is:

    var uri = new Uri("http://localhost/IntegrationTests");
    request.Expect(r => r.UrlReferrer).Return(uri).Repeat.Any();
    
    var queryString = new NameValueCollection();
    request.Expect(r => r.QueryString).Return(queryString);
    
    request.Expect(c => c.HttpMethod).Return("POST").Repeat.Any();
    
    context.Expect(c => c.Request).Return(request).Repeat.Any();
    

    I find it strange though that doing

    context.Expect(c => c.Request.HttpMethod).Return("POST").Repeat.Any();
    

    once worked, even when not setting return on Request.