2012-02-07 16 views
9

starałem się wykonać weryfikację kolejnych wywołań i stwierdziliśmy, że MOQ obsługuje metodę InSequence() dla tego, jak:Czy mogę użyć moq InSequence() z 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>())); 

to jednak wydaje się działać tylko wtedy, gdy określić mock zachowanie jako „surowe” , co zabrania mi wywoływać dodatkowe mehody na wyśmianych przedmiotach. Chciałbym jednak móc wywoływać inne metody na tych obiektach, po prostu chcę, aby te wywołania były wykonywane kolejno.

Czy istnieje jakiś "obsługiwany" sposób na to (zamiast uciekania się do .Callback() i realizacji ręcznie)? Znalazłem dodatkową bibliotekę o nazwie moq.sequence, jednak wersja skompilowana nie działa z najnowszym Moq.

Odpowiedz

9

Ok, zbadałem sprawę samodzielnie, kopiąc w kodzie źródłowym Moq w Przeglądarce SVN (tylko dla rekordu - wersją, o której mowa, jest Moq.4.0.10827.Final).

Moje dochodzenie doprowadziło mnie do: http://code.google.com/p/moq/source/browse/trunk/Source/MockSequence.cs?spec=svn751&r=712

Patrząc na metodzie InSequence(), widzę teraz, że cała realizacja jest oparta na metodzie When().

Tak więc w rzeczywistości, następujący kod:

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

kończy się za coś takiego jak:

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

Innymi słowy, jest to po prostu utworzenie zachowanie warunkowe - jeśli metoda jest wywoływana w sekwencji, określona konfiguracja() wchodzi w grę. W przeciwnym razie wykonywana jest domyślna implementacja. A ponieważ dla ścisłej sztuczki, domyślną implementacją jest rzucenie wyjątku (wywołanie jest traktowane jako nieokreślone), całe rozwiązanie działa.

W związku z tym wydaje się, że znalezienie obecnego rozwiązania do pracy z luźnymi próbami byłoby dość kłopotliwe. Po prostu pozostanę przy domowych rozwiązaniach opartych na Callback() (co może być naprawdę dobrze zapakowane, nawiasem mówiąc) - odbiera możliwość korzystania z callbacka w inny sposób, jednak i tak go nie używałem.

Zamieszczam tę odpowiedź w nadziei, że jest przydatna.

+0

Czy umieściłeś to wszystko na stronie ** Problemów Moq **? Trzeba było zbadać ten temat, więc zakładam, że nie zostało to wyjaśnione w dokumentacji, więc mogą nie być świadomi tego problemu. Mogę was zapewnić, że zapoznają się z zamieszczonymi tam problemami/sugestiami. To zajmuje trochę czasu, ale robią. Sam wysłałem kilka użytecznych łatek (drwiących delegatów, hrabiów itp.). Jeśli nie chcesz się angażować, mogę dwukrotnie sprawdzić problem i zarejestrować go, ale myślę, że jak już znasz szczegóły, opisałbyś to znacznie lepiej :) [btw. sorki, nie chciałem mieszać na SO :)] – quetzalcoatl

+0

Witam, quetzalcoatl. Nie wiedziałem, że Moq jest rzeczywiście utrzymywany, istnieją co najmniej dwa lub trzy repozytoria kodu źródłowego dla Moq. Czy to jest obecnie: https://github.com/Moq/moq4? Będę miał kilka dni wakacji przed świętami Bożego Narodzenia i przed nowym rokiem, więc może spróbuję coś złożyć lub przynajmniej zbadać dalej. –

+0

Tak, rzeczywiście, obecny jest na GitHub. Poprzednio Moq był hostowany na code.google, ale ostatnio został przeniesiony do GitHub. Lista problemów widoczna na GitHubie jest najnowsza i należy tam zgłaszać nowe problemy. Witryna code.google nadal istnieje i nie została usunięta/usunięta/itp. Ze względu na liczbę zgłoszonych "starych" problemów i żądań funkcji.Nie zostały przeniesione do GitHub, IIRC, ponieważ nie było sposobu na ich importowanie i nikt naprawdę nie chciał kopiować - wklejać je ręcznie! Nadal są brane pod uwagę, ale myślę, że problemy z GitHub mają naturalny "priorytet" w stosunku do starego code.google. – quetzalcoatl

Powiązane problemy