2009-08-16 10 views
9

Mam problemy z weryfikacją parametrów typu Ienumerable/Array podczas ustawiania oczekiwań dla wywołania metod na moich próbnych obiektach. Myślę, że ponieważ dopasowuje różne odniesienia, nie uważa tego za dopasowanie. Chcę tylko, żeby pasował do zawartości tablicy, czasami nawet nie dbam o zamówienie.Moq Dopasuj i zweryfikuj tablicę/IEnumerable parametry w ustawianiu metody

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

Idealnie chcę coś, co działa jak poniżej, prawdopodobnie mógłbym napisać metodę rozszerzenia, aby to zrobić.

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

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

Wbudowany tylko w sposób mogę dopasować je teraz jest w funkcję orzecznika, ale wydaje się, problem ten jest na tyle powszechne powinien być zbudowany w.

Czy jest zbudowany w sposób dopasować te typy lub biblioteki rozszerzeń mogę używać. Jeśli nie, po prostu napiszę metodę rozszerzenia lub coś takiego.

Dzięki

+1

Zobacz, czy to pytanie/odpowiedź pomaga w ogóle: http://stackoverflow.com/questions/1220013/expectation-on-mock-object-doesnt-seem-to -be-met-moq –

Odpowiedz

7

Gdyby wdrożyć kilka niestandardowych dopasowujących, nie znalazłem żadnych innych wbudowanych w drodze do osiągnięcia tego celu w wersji 3. Używany http://code.google.com/p/moq/wiki/QuickStart jako zasób.

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

Należy zauważyć, że to tylko sprawdza, czy wszystkie oczekiwane wartości znajdują się w kolekcji input, a nie odwrotnie. Element inputCollection może nadal zawierać elementy, które nie są oczekiwane. –

3

Nie trzeba dwa oddzielne metody tablicy i IEnumerable:

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

Poprzednia odpowiedź Oleg nie obsługuje przypadek, w którym inputCollection posiada elementy, które nie są w expectation.

Na przykład:

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

dopasuje inputCollection { 1, 2, 3, 4, 5 } gdy wyraźnie nie powinno.

Oto pełna dopasowujący:

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

Dzięki za obsługę specjalnego przypadku. – saxos

Powiązane problemy