2012-02-07 3 views
9

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

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>())); 

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

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

ответ

9

Хорошо, я сам исследовал случай, копаясь в исходном коде 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() (кстати, это может быть действительно красиво обернуто) - он убирает возможность использовать обратный вызов для других средств, однако я все равно не использовал его.

Я отправляю этот ответ в надежде, что это полезно.

+0

Вы отправили все это на сайт ** Moq's Issues **? Вы должны были исследовать предмет, поэтому я предполагаю, что это не было объяснено в документации, и они могут не знать об этой проблеме. Я могу заверить вас, что они изучают вопросы/предложения, размещенные там. Это занимает некоторое время, но они это делают. Я сам послал несколько полезных исправлений (насмешливые делегаты, Count-звонки и т. Д.). Если вы не хотите вмешиваться, я могу дважды проверить проблему и зарегистрировать ее там, но я думаю, что, поскольку вы уже знаете подробности, вы бы описали ее намного лучше :) [btw. sorki, nie chciałem polskim mieszać na SO :)] – quetzalcoatl

+0

Hi, quetzalcoatl. Я не знал, что Moq фактически поддерживается, для Moq есть как минимум два или три репозитория исходного кода. Это текущий: https://github.com/Moq/moq4? У меня будет несколько дней каникул до Рождества и до нового года, так что, возможно, я попытаюсь что-то собрать или по крайней мере расследовать дальше. –

+0

Да, действительно, текущий - это тот, что на GitHub. Ранее Moq размещался на code.google, но недавно они перешли в GitHub. Список выпусков, рассмотренных в GitHub, является самым последним, и о нем следует сообщать о новых проблемах. Сайт на code.google все еще существует и не удаляется/удаляется/и т. Д. Из-за количества «старых» проблем и запросов функций.Они не были переведены в GitHub, IIRC, так как не было никакого способа импортировать их, и никто не хотел копировать их вручную! Они по-прежнему считаются, но я думаю, что проблемы от GitHub имеют естественный «приоритет» по сравнению с старым кодом code.google. – quetzalcoatl

Смежные вопросы