【问题标题】:How to stub a method with out parameter using custom delegate?如何使用自定义委托对没有参数的方法进行存根?
【发布时间】:2015-04-06 16:44:54
【问题描述】:

我正在尝试使用 RhinoMock 的 Do 方法存根具有 out 参数的方法,但我不断收到消息 无法解析符号输出参数。这是存根部分:

private static void FakeClientsLoading(MyClass fakeClass, IEnumerable<string> clientsToLoad)
{
    fakeClass.Stub(
        x =>
            x.LoadClientsFromDb(Arg<string>.Is.Anything,
                out Arg<object>.Out(null).Dummy))
        .Do(
            new LoadClientsFromDbAction(
                (someString, out outParam ) =>
                    TestHelper.LoadClients(someString, clientsToLoad)));
 }

这是我的自定义委托声明:

public delegate void LoadClientsFromDbAction(string s, out object outParam);

我想要实现的是在调用LoadClientsFromDb 时运行测试助手方法。根据我的理解,outParam 应该映射到作为 out 参数传递给被调用方法的任何内容,但它似乎不能以这种方式工作。

【问题讨论】:

    标签: c# delegates rhino-mocks stubbing


    【解决方案1】:

    看来我终于找到了我的问题的答案。事实证明,引用this link 的第 26.3.1 节:

    具体来说,委托类型 D 与匿名方法兼容 或提供的 lambda 表达式 L:

    如果 L 是具有隐式类型参数列表的 lambda 表达式,则 D 没有 ref 或 out 参数。

    这意味着您需要一个显式类型的参数列表才能创建一个带有 out 参数的 lambda。

    不过,这还不是全部。在退出匿名方法时,仍然需要为out 参数赋值。

    最终的工作代码:

    private static void FakeClientsLoading(MyClass fakeClass, IEnumerable<string> clientsToLoad)
    {
        fakeClass.Stub(
            x =>
                x.LoadClientsFromDb(Arg<string>.Is.Anything,
                    out Arg<object>.Out(null).Dummy))
            .Do(
                new LoadClientsFromDbAction(
                    (string someString, out object outParam) =>
                    {
                        outParam = null;
                        TestHelper.LoadClients(someString, clientsToLoad);
                    }
                    ));
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-01
      • 1970-01-01
      • 2014-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多