C# 单元测试。为什么Mock在第二次循环迭代中返回不同的值?
我在以下对象上有一个模拟,其任务是收集传感器数据。它实现了这个接口:C# 单元测试。为什么Mock在第二次循环迭代中返回不同的值?,c#,unit-testing,mocking,moq,C#,Unit Testing,Mocking,Moq,我在以下对象上有一个模拟,其任务是收集传感器数据。它实现了这个接口: public interface ISensorDataCollector { List<int> CollectSensorData(int amountOfValues); } 我猜这与值有关,因为如果我删除列表清除。CollectSensorDataRepeatIfFails的返回值在所有迭代中保持不变,我的问题消失了。但这只是一个猜测。我很想知道为什么第二个调用不返回指定的返回值
public interface ISensorDataCollector
{
List<int> CollectSensorData(int amountOfValues);
}
我猜这与值有关代码>,因为如果我删除列表清除。CollectSensorDataRepeatIfFails
的返回值在所有迭代中保持不变,我的问题消失了。但这只是一个猜测。我很想知道为什么第二个调用不返回指定的返回值
问题:我错过了什么?设置是否只对模拟方法的1次调用有效?还是有一个我忘记按下的按钮使其按预期的方式运行?为什么清除列表会影响mock方法的第二次调用的返回值?有人能解释一下这件事吗
在询问之前,我做了一些研究,但我只能找到解释如何在下一次调用时使mock返回不同值的帖子。但是没有使用循环出现问题的帖子。我也会很高兴有一个重复的提示
干杯
我错过了什么?设置是否仅对模拟方法的一次调用有效
实际上,这是模拟的预期行为。设置是可变的,因为您可以通过引用更改捕获的参数或返回值。正是通过values.Clear()实现的代码>。为了避免这个问题,只需通过提供工厂延迟列表的创建。大概是这样的:
collector.Setup((x) => x.CollectSensorData(10))
.Returns<int>((i) => new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 });
collector.Setup((x)=>x.CollectSensorData(10))
.Returns((i)=>新列表{1,2,3,4,5,6,7,8,9});
这是预期的行为,因为您正在使用该列表的引用。不管你是从mock还是其他地方退回的
collector.Setup((x) => x.CollectSensorData(10)
.Returns(new List<int> { 1,2,3,4,5,6,7,8,9});
collector.Setup((x)=>x.CollectSensorData(10)
.返回(新名单{1,2,3,4,5,6,7,8,9});
您正在注册参考到列表
List values=this.AdwSensorDataCollector.CollectSensorData(10);
因此,在这个调用中,您将收到对完全相同的列表
对象的引用
values.Clear()
调用此函数将删除mock应返回的相同确切列表的所有项
您可以在此处阅读有关引用类型的更多信息:
更新:
您可以使用.Callback(()=>newlist(){1,2,3})
而不是返回
。在这种情况下,每次调用mock函数时都会调用callback。太棒了,谢谢。这很有意义。我的期望是每次调用CollectSensorData
都会返回一个新列表。但是,如果mock只是简单地保留引用,然后再次重用它,那当然就是e预期行为。@MongZhu我更新了问题,所以你可以将其用于你的预期行为。我只能接受一个答案,Johnny Bravo更快,但我对两个答案都投了更高的票。太棒了,谢谢。这很有意义。我对你的解决方案做了一些修改:。Returns(()=>{返回新列表{1,2,3,4,5,6,7,8,9};});
我只能接受一个答案,所以我会接受这个答案,因为除了解释之外,它还有一个解决方案。不过,我对两个答案都投了赞成票
collector.Setup((x) => x.CollectSensorData(10)
.Returns(new List<int> { 1,2,3,4,5,6,7,8,9});
collector.Setup((x) => x.CollectSensorData(10))
.Returns<int>((i) => new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 });
collector.Setup((x) => x.CollectSensorData(10)
.Returns(new List<int> { 1,2,3,4,5,6,7,8,9});