2010-12-10 40 views
18

Supposons que j'ai une interface avec une méthode générique et aucun paramètre:méthodes génériques Mocking

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

Maintenant, je tiens à mettre en œuvre la maquette de cette classe (j'utilise Moq) et je veux railler cette méthode pour certains types de béton - disons que je me moque Method<String>() appels.

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

L'idée de ???? devrait être clair - cette expression lambda doit gérer le cas où T dans le Method<T> est en fait un String.

Y a-t-il un moyen d'atteindre le comportement désiré?

Répondre

20

simplement:

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

assurez-vous également que votre méthode retourne en fait quelque chose comme actuellement le type de retour est défini comme 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

Ne devrait pas 'string Méthode ' être 'T Méthode '? – Scott

+1

@Secret Agent Man, non, il ne devrait pas. Au moins, il n'y a rien qui l'oblige à le faire. C'était juste un exemple que j'ai pris. Une méthode peut renvoyer ce que vous voulez. Si vous voulez remplacer le type de retour 'string' par' T', l'exemple fonctionnera toujours. –

5

Je ne l'ai pas utilisé moi-même Moq, mais je me attends:

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

(Notez que votre méthode d'échantillonnage a un type de retour de vide, donc il ne devrait rien y retourner ...

+0

Dans ce cas, la configuration est inutile car le faux est créé en mode lâche. –