如何使用自定义委托存根没有参数的方法?

How to stub a method with out parameter using custom delegate?

我正在尝试使用 RhinoMock 的 Do 方法存根一个具有 out 参数的方法,但我一直收到消息 无法解析符号 outParam .这是存根部分:

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 参数传递给被调用方法的任何内容,但它似乎无法以这种方式工作。

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

Specifically, a delegate type D is compatible with an anonymous method or lambda-expression L provided:

If L is a lambda expression that has an implicitly typed parameter list, D has no ref or out parameters.

这意味着您需要一个明确类型化的参数列表才能创建带有 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);
                }
                ));
}