Как заглушить метод с параметром без использования специального делегата?

Я пытаюсь заглушить метод, который имеет out Paramteter с помощью RhinoMock's Do метод, но я продолжаю получать сообщение не может разрешить символ 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);

Чего я хотел бы добиться, так это запускать вспомогательный метод test всякий раз, когда LoadClientsFromDb вызывается. Из моего понимания outParam должны быть сопоставлены с тем, что передается как out Параметр к вызываемому методу, но, похоже, он не работает таким образом.

1 ответ

Решение

Кажется, я наконец-то нашел ответ на свой вопрос. Оказывается, цитируя раздел 26.3.1 по этой ссылке:

В частности, тип делегата D совместим с анонимным методом или лямбда-выражением L при условии:

Если L является лямбда-выражением, которое имеет неявно типизированный список параметров, D не имеет параметров ref или out.

Это означает, что вам нужен явно заданный список параметров, чтобы создать лямбду с out параметр.

Это еще не все. Все еще необходимо присвоить значение 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);
                }
                ));
}
Другие вопросы по тегам