2012-02-23 64 views
9

嘲笑一個受保護的虛擬(非通用)的起訂量的方法很簡單:嘲笑一個受保護的通用方法與起訂量

public class MyClass 
{ 
.... 
     protected virtual int MyMethod(Data data){..} 
} 

並嘲笑它:

myMock.Protected().Setup<int>("MyMethod", ItExpr.Is<Data>(... 

我找不到的方式來使用相同的技術,如果受保護的方法是通用的,如:

protected virtual int MyMethod<T>(T data) 

任何想法如何做到這一點,除了使用一個包裝類來overri德那種方法,是高度讚賞。

+0

我不確定你是否可以。我嘗試的第一件事是將MyMethod'1 [T]傳遞給Setup(),但這似乎並沒有騙過它。無論如何,你可以試着玩。 – 2012-02-23 16:51:56

回答

6

我檢查源,它似乎與嘲諷起訂量保護的通用方法是不支持

Protected()方法創建一個類ProtectedMock<T>它使用下面的方法來獲取方法的一個實例,你想嘲笑:

private static MethodInfo GetMethod(string methodName, params object[] args) 
{ 
    return typeof(T).GetMethod(
      methodName, 
      BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public, 
      null, 
      ToArgTypes(args), 
      null); 
} 

它使用Type.GetMethod獲得方法嘲諷,但GetMethod(雖然MSDN規定不同)不玩泛型不錯,請參閱:

GetMethod for generic method

Get a generic method without using GetMethods

旁註: 在我看來嘲諷保護成員是一個代碼的氣味,我寧願嘗試與重構我的設計(即在它旁邊不是在起訂量支持反正避免)。

+0

我完全同意代碼的味道。但是有時在更復雜的情況下,這可以很容易地進行測試。即如果你對一堆方法有非常「相似」的功能,並且你只是想驗證公開的部分確實映射了參數來傳遞它們。 – 2012-02-27 17:06:29