Как сделать Mock возвращать новый список каждый раз, когда метод вызывается с использованием 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);

То, что я пытаюсь достичь, - сделать mock возвращать новый список при каждом вызове метода. Я пробовал это, но не работал:

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

Поскольку это не сработало, я думаю, что Callback - это ответ на мой вопрос, но я не нашел подходящего примера для повторной инициализации моего списка. Любые предложения?

Как вы можете задаться вопросом, зачем мне нужен новый список каждый раз, проблема в том, что я вызываю метод для разных типов объектов, внося некоторые изменения в список, в зависимости от типа объекта. Поскольку макет дает мне тот же список при каждом вызове метода, я всегда изменяю один и тот же объект в памяти, поэтому я не могу отслеживать изменения, которые я делаю на нем.

Спасибо заранее!

Ответ 1

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

Вам нужно повернуть значение внутри Возвратов в функцию. Вы попытались создать один список, а затем вернули только что использовали. Таким образом, список создается каждый раз, когда возвращаемые вызовы будут вызывать функцию каждый раз, когда это необходимо.

Ответ 2

Возврат принимает делегат Func < > (и различные перегрузки) в качестве входного параметра, поэтому вы можете указать не только некоторые данные внутри метода Returns, которые будут возвращены как параметр, но также и функции, которые будут выполнены, и результат функции будет возвращен обратно. Решение, предоставленное Rangoric, будет отлично работать в вашем случае.