2009-08-16 30 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