Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单元测试。为什么Mock在第二次循环迭代中返回不同的值?_C#_Unit Testing_Mocking_Moq - Fatal编程技术网

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});