首页 > 解决方案 > 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,我猜这与更新参数的时间有关。

提前致谢!

标签: c#unit-testingcallbackmoq

解决方案


不确定您要测试方法调用的确切内容或添加到集合中的值。但是如果你想测试那个方法被调用了,你可以像这样使用验证函数 -

mock.Verify(mock => mock.GetResponse(It.IsAny<int>(), strings), Times.Exactly(2));

PS。您应该只使用It.IsAny<int>()一次cause first param从循环SO_responder.GetResponse(0, strings)调用中获取索引,依此类推。


推荐阅读