【发布时间】:2019-03-06 08:57:27
【问题描述】:
我对以下对象有一个 Mock,其工作是收集传感器数据。它实现了这个接口:
public interface ISensorDataCollector
{
List<int> CollectSensorData(int amountOfValues);
}
在测试里面我有如下安排:
// ARRANGE
var collector = new Mock<ISensorDataCollector>() { CallBase = true };
// Mock SensorDataCollector
collector.Setup((x) => x.CollectSensorData(10)
.Returns(new List<int> { 1,2,3,4,5,6,7,8,9});
myProcess.AdwSensorDataCollector = collector.Object;
// ACT
myProcess.CollectSensorDataRepeatIfFails(5);
要测试的方法有一个收集数据的 while 循环。简单版本如下所示:
public ISensorDataCollector SensorDataCollector { get; set; }
public void CollectSensorDataRepeatIfFails(int counterForRepeatedMeasurement)
{
do
{
List<int> values = this.SensorDataCollector.CollectSensorData(10);
values.Clear();
counterForRepeatedMeasurement--;
} while (counterForRepeatedMeasurement >= 0);
}
问题:从this.AdwSensorDataCollector.CollectSensorData(10); 行的第二次迭代返回一个空列表。但我希望它每次都能返回我在设置中指定的值:
collector.Setup((x) => x.CollectSensorData(10)
.Returns(new List<int> { 1,2,3,4,5,6,7,8,9});
我想这与values.Clear(); 有关,因为如果我删除列表清除。 CollectSensorDataRepeatIfFails 的返回值在所有迭代中保持不变,我的问题就消失了。但这只是一个猜测。我真的很想知道为什么第二次调用没有返回指定的返回值。
问题:我错过了什么?该设置是否仅适用于模拟方法的 1 次调用?或者是否有一个我忘记按下的按钮使其按预期方式运行?为什么清空列表会影响第二次调用mocked方法的返回值?有人可以解释一下这个问题吗?
在询问之前我做了一些研究,但我只能找到解释如何使模拟在下次调用时返回不同值的帖子。但是没有使用循环出现问题的帖子。如果有重复的小费,我也会很高兴。
干杯
【问题讨论】:
标签: c# unit-testing mocking moq