2015-02-06 9 views
1

Я пытаюсь заглушить метод, который имеет параметр out с использованием метода RhinoMock Do, но я продолжаю получать сообщение не может решить символ outParam. Вот раскорчевка часть:Как заглушить метод с параметром 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 вызываемому методу, но, похоже, он не работает таким образом.

ответ

1

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

В частности, тип делегата 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); 
       } 
       )); 
}