如何使Mock在每次使用Moq调用方法时返回一个新列表

本文关键字:返回 一个 列表 新列表 方法 Mock 何使 调用 Moq | 更新日期: 2023-09-27 18:13:54

我使用MOQ来模拟具有预期返回列表的方法调用。我的方法返回一个列表,但我希望模拟每次调用该方法时都生成一个新列表。到目前为止我所做的:

List<Correlation> expected = new List<Correlation> { new Correlation() { Code = "SelfError1" }, new Correlation() { Code = "SelfError2" } };
Mock<IRPLValidator> selfMock = new Mock<IRPLValidator>();
selfMock.Setup(f => f.Validate()).Returns(expected);

我想要实现的是每次调用方法get时使模拟返回一个新列表。我试过这个,但没有工作:

selfMock.Setup(f => f.Validate()).Returns(new List<Correlation>{ new Correlation() { Code = "SelfError1" }, new Correlation() { Code = "SelfError2" } });

由于这没有工作,我想也许回调是我的问题的答案,但我没有找到任何适当的例子来重新初始化我的列表。有什么建议吗?

你可能想知道为什么我每次都需要一个新的列表,问题是我在不同的对象类型上调用该方法,根据对象类型在列表中进行一些更改。因为每次调用该方法时mock都会给我相同的列表,所以我总是在内存中修改相同的对象,因此我无法跟踪我对它所做的更改。

提前感谢!

如何使Mock在每次使用Moq调用方法时返回一个新列表

selfMock.Setup(f => f.Validate()).Returns(() => new List<Correlation>{ new Correlation() { Code = "SelfError1" }, new Correlation() { Code = "SelfError2" } });

您需要将return中的值转换为函数。您尝试的版本创建了单个列表,然后返回只是使用它。这样,每次都创建列表,因为每次需要返回时都会调用该函数。

Return接受一个Func<>(和各种重载)委托作为输入参数,因此您不仅可以在Returns方法中指定一些数据,这些数据将作为参数返回,还可以指定函数,这些函数将被执行并返回函数的结果。Rangoric提供的解决方案在您的情况下可以很好地工作。

相关文章: