c# - Moq - 更新回调内部的参考参数不起作用
问题描述
我正在尝试对循环调用函数的方法进行单元测试。提供给该方法的参数之一是List<string>
在循环外声明的 a ,它应该在传递给它的每个调用中更新。
我一直在尝试使用我在 SO 上找到的一些示例来模拟这种行为,这些示例涉及更新 a 内部的参数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());
//...
}
因此,当我尝试更新回调中的字符串集合时,工作室会突出显示参数并给我警告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));
PS。您应该只使用It.IsAny<int>()
一次cause first param从循环SO_responder.GetResponse(0, strings)
调用中获取索引,依此类推。
推荐阅读
- python-3.x - 在 Pyhton3 中调用 lambda 时如何打印 lambda 函数参数
- c# - uwp 限制 AdvancedCollectionView 中的项目数
- javascript - Javascript:对象方法与 Object.prototype 方法
- html - 如果动态内容需要更多空间,是否可以隐藏 html 元素?
- javascript - 直到超时才解决承诺的测试 sinon chai
- javafx - 如何在netbeans中打开fxml文件?
- android - 不同布局中的findViewById(找不到BottomNavigationView)
- ruby-on-rails - Rails 助手作为一个类
- opencv - 将图像从 cvimg 正确转换为张量
- java - 如何修复扫描仪类采用额外的空白输入