2010-12-10 81 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