2009-08-16 57 views
9

我在驗證Ienumerable/Array類型參數時設置了模擬對象的方法調用的期望時出現問題。我認爲,因爲它與不同的參考相匹配,所以它不認爲它是匹配的。我只是希望它匹配數組的內容,有時我甚至不關心順序。Moq匹配和驗證數組/方法設置中的IEnumerable參數

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

理想情況下,我想要像下面這樣工作的東西,我大概可以寫一個擴展方法來做到這一點。

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

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

唯一內置的方式,我可以匹配這些現在與謂語的功能,但似乎這個問題是很常見應該是內置的。

有一個內置的方式來匹配這些類型或我可以使用的擴展庫。如果沒有,我只會寫一個擴展方法或其他東西。

感謝

+1

看看這個問題/答案可以幫助所有:http://stackoverflow.com/questions/1220013/expectation-on-mock-object-doesnt-seem-to -be-met-moq – 2009-08-21 13:39:54

回答

7

必須實現一些自定義的匹配,都沒有發現任何其他內置的方式在使用http://code.google.com/p/moq/wiki/QuickStart作爲資源版本3。做到這一點。

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

請注意,這只是檢查是否所有預期值都在inputCollection中,而不是相反。 inputCollection仍然可以包含不符合預期的項目。 – 2012-11-03 19:01:36

3

你不需要爲陣列和IEnumerable兩種不同的方法:

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

由奧列格以前的答案不處理情況下inputCollection已經不在expectation元素。

例如:

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

將匹配inputCollection { 1, 2, 3, 4, 5 }當它顯然不應該。

下面是完整的匹配:

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

謝謝,爲處理特殊情況。 – saxos 2014-09-08 07:40:33