2009-08-16 6 views
9

Je rencontre des problèmes lors de la vérification des paramètres de type Ienumerable/Array lors de la configuration de l'attente pour les méthodes appelées sur mes objets fantaisie. Je pense que puisqu'il correspond à des références différentes, il ne considère pas cela comme un match. Je veux juste que cela corresponde au contenu du tableau, parfois je ne me soucie même pas de la commande. Idéalement, je veux quelque chose qui fonctionne comme suit, je pourrais probablement écrire une méthode d'extension pour ce faire.Moq Match et Verify Array/paramètres IEnumerable dans la configuration de la méthode

It.Contains(new string[]{"file2.txt","file1.txt"}) 

It.ContainsInOrder(new string[]{"file2.txt","file1.txt"}) 

Le seul construit de manière que je peux correspondre à ce droit est maintenant avec la fonction sous-jacente, mais il semble que ce problème est assez commun, il devrait être construit.

est-il construit de manière à correspondre ces types, ou bibliothèque d'extension je peux utiliser. Sinon, je vais juste écrire une méthode d'extension ou quelque chose.

Merci

+1

Voir si cette question/réponse aide à tous: http://stackoverflow.com/questions/1220013/expectation-on-mock-object-doesnt-seem-to -be-met-moq –

Répondre

7

Nous avons dû mettre en œuvre des matchers personnalisés, n'ont pas trouvé d'autre construit façon d'y parvenir dans la version 3. Utilisé http://code.google.com/p/moq/wiki/QuickStart comme une ressource.

public T[] MatchCollection<T>(T[] expectation) 
{ 
    return Match.Create<T[]>(inputCollection => (expectation.All((i) => inputCollection.Contains(i)))); 
} 

public IEnumerable<T> MatchCollection<T>(IEnumerable<T> expectation) 
{ 
    return Match.Create<IEnumerable<T>>(inputCollection => (expectation.All((i) => inputCollection.Contains(i)))); 
} 


public void MyTest() 
{ 

... 

mockDataWriter.Setup(m => m.UpdateFiles(MatchCollection(new string[]{"file2.txt","file1.txt"}))); 

... 


} 
+0

Notez que cela vérifie simplement si toutes les valeurs attendues se trouvent dans la collection d'entrées, et non l'inverse. L'entréeCollection peut toujours contenir des éléments qui ne sont pas dans l'attente. –

3

Vous n'avez pas besoin de deux méthodes distinctes pour tableau et IEnumerable:

private static IEnumerable<T> MatchCollection<T>(IEnumerable<T> expectation) 
{ 
    return Match.Create<IEnumerable<T>>(inputCollection => expectation.All(inputCollection.Contains)); 
} 
4

réponse précédente Oleg ne traite pas les cas où inputCollection comporte des éléments qui ne sont pas expectation.

Par exemple:

MatchCollection(new [] { 1, 2, 3, 4 }) 

correspondront inputCollection { 1, 2, 3, 4, 5 } quand il ne devrait pas clairement.

Voici le matcher complet:

public static IEnumerable<T> CollectionMatcher<T>(IEnumerable<T> expectation) 
{ 
    return Match.Create((IEnumerable<T> inputCollection) => 
         !expectation.Except(inputCollection).Any() && 
         !inputCollection.Except(expectation).Any()); 
} 
+0

Merci, pour la manipulation du cas particulier. – saxos

Questions connexes