2010-12-10 75 views
18

假設我有一個通用的方法和一些接口沒有參數:嘲諷泛型方法

public interface Interface { 
    void Method<T>(); 
} 

現在我希望實現這個類的模擬(我使用Moq),我想嘲笑這種方法對於某些具體類型 - 比方說,我正在嘲笑Method<String>()調用。

mock = new Mock<Interface>(); 
mock.Setup(x => x.Method ????).Returns(String("abc")); 

????的想法應該是明確的 - 這lambda表達式應該處理的情況下TMethod<T>實際上是一個String

有沒有什麼辦法可以實現想要的行爲?

回答

20

簡單:

mock.Setup(x => x.Method<string>()).Returns("abc"); 

另外,還要確保你的方法實際上返回的東西,如目前在返回類型被定義爲void

public interface Interface 
{ 
    string Method<T>(); 
} 

class Program 
{ 
    static void Main() 
    { 
     var mock = new Mock<Interface>(); 
     mock.Setup(x => x.Method<string>()).Returns("abc"); 

     Console.WriteLine(mock.Object.Method<string>()); // prints abc 
     Console.WriteLine(mock.Object.Method<int>()); // prints nothing 
    } 
} 
+0

不應該'字符串方法'是'T方法'? – Scott 2010-12-10 11:46:23

+1

@祕密代理人,不,它不應該。至少沒有任何事情要求它這樣做。這只是我拿的一個例子。一個方法可以返回任何你想要的。如果你想用'T'替換'string'返回類型,這個例子仍然可以工作。 – 2010-12-10 11:47:37

5

我還沒有使用起訂量自己,但是我希望:

mock.Setup(x => x.Method<string>()); 

(請注意,您的樣本方法有一個void返回類型,所以它不應該被返回任何東西...

+0

在其作爲模擬在鬆散模式下創建的情況下的設置是不必要的。 – 2014-06-24 14:58:18