Могу ли я использовать MoS InSequence () с MockBehavior.Loose? - PullRequest
9 голосов
/ 07 февраля 2012

Я пытался выполнить последующую проверку вызовов и обнаружил, что moq для этого поддерживает метод InSequence (), например:

MockSequence s = new MockSequence();
validator.InSequence(s).Setup(m => m.IsValid(It.IsAny<Frame>())).Returns(true);
encryptor.InSequence(s).Setup(m=>m.Encrypt(It.IsAny<Frame>()));
socket.InSequence(s).Setup(m => m.Send(It.IsAny<Frame>()));
compressor.InSequence(s).Setup(m => m.Compress(It.IsAny<Frame>()));

Однако, похоже, это работает только тогда, когда я задаю имитационное поведение как "строгое", что запрещает мне вызывать дополнительные методы для максируемых объектов. Однако я хотел бы иметь возможность вызывать другие методы для этих объектов, я просто хочу, чтобы ЭТИ вызовы выполнялись последовательно.

Есть ли какой-либо "поддерживаемый" способ для этого (вместо использования .Callback () и ручной реализации)? Я нашел дополнительную библиотеку с именем moq.sequence, однако предварительно скомпилированная версия не работает с последним Moq.

1 Ответ

9 голосов
/ 15 февраля 2012

Хорошо, я сам расследовал этот случай, покопавшись в исходном коде Moq в браузере SVN (только для записи - речь идет о версии moq Moq.4.0.10827.Final ).

Мое расследование привело меня к: http://code.google.com/p/moq/source/browse/trunk/Source/MockSequence.cs?spec=svn751&r=712

Посмотрев на метод InSequence (), я теперь вижу, что вся реализация основана на методе When () .

Итак, на самом деле, следующий код:

validator.InSequence(s).Setup(m => m.IsValid(It.IsAny<Frame>())).Returns(true);

заканчивается как что-то вроде:

validator.When(/* call is made in sequence */).Setup(m => m.IsValid(It.IsAny<Frame>())).Returns(true);

Другими словами, это просто настройка условного поведения - когда метод вызывается последовательно, указанная функция Setup () вступает в игру. В противном случае выполняется реализация по умолчанию. А поскольку для строгой имитации реализация по умолчанию выбрасывает исключение (вызов обрабатывается как неопределенный), все решение работает.

Следовательно, кажется, что получить текущее решение для работы со свободными издевательствами было бы довольно обременительно. Я просто остановлюсь на самодельных решениях, основанных на Callback () (который, кстати, может быть действительно красиво упакован) - он лишает возможности использовать callback для других средств, однако я все равно не использовал его.

Я публикую этот ответ в надежде, что он будет полезен.

...