2015-02-06 38 views
1

我試圖使用RhinoMock的Do方法存根out參數的一種方法,但我不斷收到消息無法解析符號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

看來我終於找到了我的問題的答案。事實證明,從this link引述部分26.3.1:

具體而言,委託類型d是與設置匿名方法 或λ-表達大號兼容:

如果L是λ表達式有一個隱含類型的參數列表,D沒有參數或輸出參數。

這意味着你爲了創建具有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); 
       } 
       )); 
} 
相關問題