在设置对我的模拟对象的方法调用的期望时,我在验证 Ienumerable/Array 类型参数时遇到问题。我认为因为它匹配不同的引用,所以它不认为它是匹配的。我只是想让它匹配数组的内容,有时我什至不关心顺序。
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"})
我现在可以匹配这些的唯一内置方式是使用谓词功能,但似乎这个问题很常见,应该内置。
是否有内置的方法来匹配这些类型,或者我可以使用的扩展库。如果没有,我就写一个扩展方法什么的。
谢谢
最佳答案
必须实现一些自定义匹配器,在版本 3 中还没有找到任何其他内置方法来完成此操作。使用 http://code.google.com/p/moq/wiki/QuickStart作为资源。
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"}) ) );
...
}
关于unit-testing - 方法设置中的 Moq 匹配和验证数组/IEnumerable 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1285316/