2009-08-16 7 views
9

Ich habe Probleme beim Überprüfen der Ienumerable/Array-Typ-Parameter beim Einrichten der Erwartung für Methoden Aufruf meiner Mock-Objekte. Ich denke, da es verschiedene Referenzen zusammenbringt, hält es das nicht für eine Übereinstimmung. Ich möchte nur, dass es dem Inhalt des Arrays entspricht, manchmal kümmert es mich nicht einmal um die Reihenfolge.Moq Match und Verify Array/IEnumerable Parameter in der Methodeneinstellung

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

Idealerweise möchte ich etwas, das wie folgt funktioniert, ich könnte wahrscheinlich eine Erweiterungsmethode schreiben, um dies zu tun.

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

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

Die einzige in Art und Weise gebaut kann ich diese richtig passen jetzt mit dem Prädikat Funktion ist, aber es scheint, dieses Problem häufig genug ist es sollte gebaut werden.

Gibt es eine in Art und Weise gebaut übereinstimmen Diese Typen oder Erweiterungsbibliothek kann ich verwenden. Wenn nicht, schreibe ich einfach eine Erweiterungsmethode oder etwas. Gebrauchte http://code.google.com/p/moq/wiki/QuickStart als Ressource

Dank

+1

Sehen Sie, wenn diese Frage/Antwort überhaupt hilft: http://stackoverflow.com/questions/1220013/expectation-on-mock-object-doesnt-seem-to -be-met-moq –

Antwort

7

Hatte einige benutzerdefinierte Matcher zu implementieren, haben andere in Art und Weise gebaut wurde nicht gefunden diese 3. in Version zu erreichen.

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

Beachten Sie, dass dies nur überprüft, ob alle erwarteten Werte in der inputCollection sind und nicht umgekehrt. Die inputCollection kann weiterhin Elemente enthalten, die nicht in der Erwartung enthalten sind. –

3

Sie brauchen nicht zwei separate Verfahren zur Anordnung und IEnumerable:

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

vorherige Antwort von Oleg nicht Fall nicht behandeln, in denen inputCollection Elemente hat, die nicht in expectation ist.

Zum Beispiel:

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

wird inputCollection übereinstimmen { 1, 2, 3, 4, 5 } wenn es sollte eindeutig nicht.

Hier ist die komplette Matcher:

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

Danke, für den Umgang mit dem Sonderfall. – saxos

Verwandte Themen