Как заставить макет возвращать новый список каждый раз, когда метод вызывается с использованием Moq

#c# #.net #mocking #moq

#c# #.net #издевательство #moq

Вопрос:

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

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

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

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

Ответ №1:

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

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

Комментарии:

1. Спасибо — однажды я получу всю эту штуку с закрытием.

2. Жаль, что я не нашел это раньше, вчера потратил день, задаваясь вопросом, почему мой список не возвращается обновленным! Спасибо!!!

Ответ №2:

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