【问题标题】:Rhino mocks of properties property属性属性的犀牛模拟
【发布时间】:2016-02-23 08:39:25
【问题描述】:

当我依次执行这两行时,我的代码在第二行出现Previous method 'HttpContextBase.get_Request();' requires a return value or an exception to throw. 失败。

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

但是,当我只执行其中一行时,代码运行良好。

执行以下操作并不能解决问题。

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

有人理解这种奇怪的行为吗?

谢谢,
德鲁滕

编辑:整个代码是:

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

【问题讨论】:

    标签: c# asp.net-mvc rhino-mocks


    【解决方案1】:

    我解决了这个问题。问题可能与

    的混合有关
    context.Expect(c => c.Request.UrlReferrer).Return(uri).Repeat.Any();  
    

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

    工作代码是:

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

    我觉得这样做很奇怪

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

    一旦工作,即使没有在请求上设置返回。

    【讨论】:

    • 对了,你为什么会有很多期待?根据我的经验,这很难维持。通常你不关心一个属性是否被读取以及被读取了多少次。您只需将它们存根(使用Stub),如果您真的想知道是否调用了某些东西,请在最后使用AssertWasCalled。这就是 AAA 语法的美妙之处。
    • @Stefan 那是真的!我不在乎他们被调用了多少次,并且可能应该使用存根。我在这里添加了 Expects 只是为了获得正确的返回值,但也许有更简单的方法使用存根?
    • 使用.Stub 而不是.Expect
    猜你喜欢
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2010-11-07
    • 2016-06-06
    • 2010-10-29
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    相关资源
    最近更新 更多