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

时间:2011-11-08 14:15:39

标签: c# .net mocking moq

我正在使用MOQ模拟带有预期返回列表的方法调用。我的方法返回一个列表,但我希望每次调用该方法时,mock都会创建一个新列表。 到目前为止我做了什么:

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

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

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

由于这没有用,我想也许Callback是我的问题的答案,但我没有找到重新初始化我的列表的任何正确的例子。 有什么建议吗?

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

提前致谢!

2 个答案:

答案 0 :(得分:17)

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

您需要将Return中的值转换为函数。您尝试的版本创建了一个列表,然后返回刚才使用的那个。这样,每次创建列表时,返回将在每次需要时调用该函数。

答案 1 :(得分:2)

返回将一个Func&lt;&gt;(和各种重载)委托作为输入参数,因此您不仅可以指定将作为参数返回的Returns方法中的一些数据,还可以指定将要执行的函数以及将执行的结果功能将被退回。 Rangoric提供的解决方案在您的情况下可以正常工作。