如何解决Moq - 在回调中更新参考参数不起作用
我正在尝试对在循环中调用函数的方法进行单元测试。提供给该方法的参数之一是在循环外声明的 List<string>
,每次传递给它的调用都应更新该参数。
我一直在尝试使用我在 SO 上找到的一些示例来模拟这种行为,这些示例涉及更新 Callback()
内的参数,但这对我来说并没有按预期工作。
以下是我遇到的问题的简短示例:
public async Task DoSomething() {
var strings = new List<string>();
for(i = 0; i < 2; i++) {
var response = await _responder.GetResponse(i,strings);
//method adds a new string into the collection on each call
}
}
所以为了测试这一点,我需要模拟两个方法调用,知道字符串集合在一个上是空的,而在另一个上包含一个元素......
测试
public async Task TestDoSomething() {
var strings = new List<string>();
var mock = new Mock<Responder>();
mock.Setup(x => x.GetResponse(0,strings)) //mocks first iteration of loop
.ReturnsAsync(new Response())
.Callback<int,List<string>>((number,stringCollection) => {
stringCollection = new List<string> {"addedString"}; //this is where the problem occurs
strings = stringCollection;
});
mock.Setup(x => x.GetResponse(1,strings)) //mocks second iteration of loop
.ReturnsAsync(new Response());
//...
}
因此,当我尝试更新回调中的字符串集合时,studio 会突出显示该参数并给我警告 The value passed to the method is never used because it is overwritten in the method body before being read
。
测试失败,因为设置不匹配,尝试调试会导致测试崩溃和退出。
有人能指出我正确的方向吗?在警告消息和这些东西的所有其他示例仅使用 Returns
而不是 ReturnsAsync
的事实之间,我猜这与更新参数的时间有关。
提前致谢!
解决方法
不确定您到底要测试什么方法调用或添加到集合中的值。 但是如果你想测试那个方法被调用了,你可以像这样使用验证函数 -
mock.Verify(mock => mock.GetResponse(It.IsAny<int>(),strings),Times.Exactly(2));
附注。您应该使用 It.IsAny<int>()
因为第一个参数从循环 SO _responder.GetResponse(0,strings)
调用中获取索引仅一次,依此类推。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。