Как заставить Mock возвращать новый список каждый раз, когда метод вызывается с помощью Moq - PullRequest
14 голосов
/ 08 ноября 2011

Я использую 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" } });

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

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

Заранее спасибо!

Ответы [ 2 ]

17 голосов
/ 08 ноября 2011
selfMock.Setup(f => f.Validate()).Returns(() => new List<Correlation>{ new Correlation() { Code = "SelfError1" }, new Correlation() { Code = "SelfError2" } });

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

2 голосов
/ 08 ноября 2011

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

...