使用最小起订量验证某些方法的不同参数的多次调用
Verify multiple invocations with different parameters of some method using moq
我有一些存储库,我有一个方法,我想测试它是在循环中调用的,参数是一个数组。此方法一次从数组中获取 100 个项目的值。因此,如果我有一个包含 434 个项目的数组,则应该调用 5 次方法。
那么我该如何测试这个方法,例如我需要验证此方法被调用 5 次并作为包含 434 个项目的参数数组传递?
var items = GetListOfStrings(434); // return list with 434 items
context.Mock<ISomeRepository>()
.Verify(method => method.GetSomeItems(It.IsAny<string[]>(), Times.Exactly(5)));
现在我作为参数传递 It.IsAny<string>()
,但我想传递 items
并在每次方法调用中获取接下来的 100 个项目。可能吗?
您可以传递 items
的范围并通过比较两个数组是否包含相同元素(使用 SequenceEqual
)来验证调用:
List<string> items = GetListOfStrings(494);
Mock.Get(someRepository).Verify(repository => repository.GetSomeItems(It.Is<string[]>(strings => strings.SequenceEqual(items.GetRange(0, 100)))), Times.Once);
Mock.Get(someRepository).Verify(repository => repository.GetSomeItems(It.Is<string[]>(strings => strings.SequenceEqual(items.GetRange(100, 100)))), Times.Once);
Mock.Get(someRepository).Verify(repository => repository.GetSomeItems(It.Is<string[]>(strings => strings.SequenceEqual(items.GetRange(200, 100)))), Times.Once);
// ...
我有一些存储库,我有一个方法,我想测试它是在循环中调用的,参数是一个数组。此方法一次从数组中获取 100 个项目的值。因此,如果我有一个包含 434 个项目的数组,则应该调用 5 次方法。
那么我该如何测试这个方法,例如我需要验证此方法被调用 5 次并作为包含 434 个项目的参数数组传递?
var items = GetListOfStrings(434); // return list with 434 items
context.Mock<ISomeRepository>()
.Verify(method => method.GetSomeItems(It.IsAny<string[]>(), Times.Exactly(5)));
现在我作为参数传递 It.IsAny<string>()
,但我想传递 items
并在每次方法调用中获取接下来的 100 个项目。可能吗?
您可以传递 items
的范围并通过比较两个数组是否包含相同元素(使用 SequenceEqual
)来验证调用:
List<string> items = GetListOfStrings(494);
Mock.Get(someRepository).Verify(repository => repository.GetSomeItems(It.Is<string[]>(strings => strings.SequenceEqual(items.GetRange(0, 100)))), Times.Once);
Mock.Get(someRepository).Verify(repository => repository.GetSomeItems(It.Is<string[]>(strings => strings.SequenceEqual(items.GetRange(100, 100)))), Times.Once);
Mock.Get(someRepository).Verify(repository => repository.GetSomeItems(It.Is<string[]>(strings => strings.SequenceEqual(items.GetRange(200, 100)))), Times.Once);
// ...