#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, будет отлично работать в вашем случае.