【问题标题】:What is the correct way to create a stub/mock for the Scheme property present under Uri in Rhinomocks为 Rhinomocks 中 Uri 下存在的 Scheme 属性创建存根/模拟的正确方法是什么
【发布时间】:2019-09-06 01:28:31
【问题描述】:

我正在 Rhinomocks 框架的帮助下为 c# 方法编写单元测试用例。在我的实际方法中,我从 System.Net.Http.HttpRequestMessage 命名空间下的 Uri 属性访问 Scheme 属性。

scheme 属性在实际方法中的访问方式类似于_requestContext.RequestMessage.RequestUri.Scheme

当我运行我的单元测试用例时,当它尝试访问/读取方案属性时,它会在我的实际实现方法中崩溃。

为了模拟 URI 和 Scheme 属性,我尝试了以下方法,但没有按预期工作。

var uri = new Uri("http://tempuri.org/");
//requestContext.Expect(r => r.RequestMessage.RequestUri).Return(uri).Repeat.Any();

requestContext.Stub(x => x.RequestMessage.RequestUri).Return(uri);

requestContext.Stub(x => x.RequestMessage.RequestUri.Scheme).Return("http");//this is the value the scheme should return when it is accessed inside the actual method

为存在于 Uri 下的 Scheme 属性创建存根/模拟的正确方法是什么。

注意:我指的是 System.Net.Http.HttpRequestMessage 命名空间下的 Uri 属性。

【问题讨论】:

    标签: c# unit-testing mocking rhino-mocks stub


    【解决方案1】:

    您的示例中使用的具体Uri 将包含该方案。无需进一步模拟它。

    var uri = new Uri("http://tempuri.org/");
    
    var scheme = uri.Scheme; //return "http"    
    
    requestContext.Stub(x => x.RequestMessage.RequestUri).Return(uri);
    

    所以调用RequestMessage.RequestUri.Scheme 将从具体的Uri 返回方案。在这种情况下是http,正如您已经知道并在您的原始帖子中陈述的那样。

    另外根据您对我最初建议的评论,我建议您创建一个实际的HttpRequestMessage 并根据需要填充它。

    var uri = new Uri("http://tempuri.org/");
    var request = new HttpRequestMessage(HttpMethod.Get, uri);
    
    requestContext.Stub(x => x.RequestMessage).Return(request);
    

    现在不需要模拟与请求相关的任何其他内容,因为使用的是实际实现。

    【讨论】:

    • 尝试了您指定的方式,但在运行测试用例时出现异常。 System.InvalidOperationException: 'Type 'System.Uri' 与方法 'IRequestContext.get_RequestMessage();'' 的返回类型 'System.Net.Http.HttpRequestMessage' 不匹配 ...执行该行时抛出此错误: requestContext.Stub(x => x.RequestMessage.RequestUri).Return(uri);
    • @Krishnan 然后我建议你创建一个实际的 HttpRequestMessage 并根据需要填充它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    相关资源
    最近更新 更多