Moq - 在回调中更新参考参数不起作用

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?