2010-12-10 21 views
18

Załóżmy Mam interfejsu z metody rodzajowe i ma parametry:wyśmianie metody generyczne

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

Teraz pragnę realizować makiety dla tej klasy (używam Moq) i życzę, aby drwić z tej metody dla konkretnego typu - powiedzmy, że kpię z połączeń Method<String>().

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

Pomysł ???? powinno być jasne - to wyrażenie lambda powinna obsłużyć przypadek, gdy T w Method<T> jest rzeczywiście String.

Czy jest jakiś sposób mogę osiągnąć żądaną zachowanie?

Odpowiedz

20

prostu:

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

także upewnić się, że metoda faktycznie zwraca coś jak obecnie typ zwracany jest zdefiniowany jako 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

Gdyby nie '' Metoda ciąg być '' Metoda T ? – Scott

+1

@Secret Agent Man, nie, nie powinien. Przynajmniej nie ma niczego, co by to zobowiązało. To był tylko przykład, który wziąłem. Metoda może zwrócić, co chcesz. Jeśli chcesz, możesz zastąpić typ zwracany 'string' przez' T', przykład będzie działał. –

5

Nie używałem Min siebie, ale ja się spodziewać:

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

(Należy pamiętać, że metoda próbka ma typ void powrotny, więc nie powinno być powrocie nic ...

+0

W takim przypadku konfiguracja nie jest konieczna, ponieważ próbę tworzy się w trybie swobodnym. –

Powiązane problemy