Как заглушить метод с параметром без использования специального делегата?
Я пытаюсь заглушить метод, который имеет 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);
}
));
}