【问题标题】:Out parameters with RhinoMocks使用 RhinoMocks 输出参数
【发布时间】:2014-01-18 05:24:47
【问题描述】:

我显然很困惑 - 这是我使用我们正在考虑的其他几个框架(NMock、Moq、FakeItEasy)完成的任务。我有一个要存根的函数调用。函数调用有一个 out 参数(一个对象)。

函数调用在代码中多次调用的用例中。调用代码提交参数,包括用于 out 参数的 NULL 对象。我想根据提供的其他参数设置预期的 OUT 参数。

如何指定预期的 NULL 入站输出参数,按我预期的方式填充的对象的预期 OUTBOUND 输出参数?我已经尝试了六种方法到周日,但到目前为止,我的 OUTBOUND out 参数除了 NULL 之外什么都没有。

【问题讨论】:

    标签: rhino-mocks


    【解决方案1】:

    来自http://ayende.com/wiki/Rhino+Mocks+3.5.ashx#OutandRefarguments

    Ref 和 out 参数是特殊的,因为你还必须使 编译器高兴。关键字 ref 和 out 是强制性的,你需要 一个字段作为参数。 Arg 不会让你失望:

    User user;
    if (stubUserRepository.TryGetValue("Ayende", out user))
    {
      //...
    }
    stubUserRepository.Stub(x =>
      x.TryGetValue(
        Arg.Is("Ayende"), 
        out Arg<User>.Out(new User()).Dummy))
      .Return(true);
    

    out 是编译器的强制要求。 Arg.Out(new User()) 是 对我们来说很重要的部分,它指定 out 参数应该 返回新用户()。 Dummy 只是指定类型 User 的字段, 让编译器开心。

    【讨论】:

    • 链接现在得到 404 Not Found。
    【解决方案2】:

    如果使用存储库生成 Mock/Stub

    checkUser = MockRepository.GenerateMock<ICheckUser>
    

    你可以用out参数设置期望

    checkUser
    .Expect(c => c.TryGetValue(Arg.Is("Ayende"), out Arg<User>.Out(new User()).Dummy)
    .Return(true) 
    

    【讨论】:

      【解决方案3】:

      此解决方案更简洁,可与 Rhino Mocks 3.6 配合使用:

      myStub.Stub(x => x.TryGet("Key", out myValue))
            .OutRef("value for the out param")
            .Return(true);
      

      【讨论】:

      • 这是唯一对我有用的方法。它无法识别out Arg&lt;User&gt;.Out 语法。 +1
      • 我还要补充一点,从 C# 7.0 开始,您可以使用下划线作为 out 变量的丢弃,将其进一步简化为 x.TryGet("Key", out _)(这也使您不必声明 @ 987654325@别处)。
      猜你喜欢
      • 2013-04-24
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多