MC, 23:25 czwartek, 22.03.2012 r.
Ilustracja do artykułu: Moq - Ustawienie zwracania wielu różnych wartości przez metody

Moq - Ustawienie zwracania wielu różnych wartości przez metody

Moq jest biblioteką pozwalającą tworzyć mockowe obiekty (sztuczne? nie znam polskiego słowa, które by się nadawało do pełnego oddania tego, co się z tym obiektem dzieje, więc zostanę przy takiej nomenklaturze) oferującą szereg możliwości niezwykle przydatnych podczas pisania testów jednostkowych. Chciałbym dziś podzielić się ostatnio napotkanym, sprytnym obejściem problemu ustawienia kilku kolejnych wartości zwracanych przez metodę, czy własność mockowanego obiektu.

Dlaczego w ogóle to obchodzić?

Konkurencyjne biblioteki takie jak np. NSubstitute, czy Rhino Mocks, pozwalają na ustawienie kolejnych wartości zwracanych przez metodę obiektu. Moq, niestety nie, ale jak się okazuje można to bardzo sprytnie obejść, także problem okazuje się znikać. Wystarczy, że użyjemy zaimplementowanego w platformie .NET obiektu Queue.

Jak to zrobić?

Załóżmy, że chcemy zmockować NaszObiekt, który dziedziczy po interfejsie INaszObiekt i zależy nam na tym, by metoda JakasMetoda() należąca do tego obiektu (która zwraca wartość liczbową int) za każdym wywołaniem zwracała kolejno 1, 2, 3, 4 i 5. Wykorzystamy do tego metody Setup() i Returns() pochodzące z biblioteki Moq, dokładnie w ten sam sposób jak gdybyśmy chcieli ustawić jedną wartość zwracaną. De facto to właśnie zrobimy, tyle że podłożymy kolejkę Queue jako rezultat, z której będziemy wyrzucać zwrócony element i tym samym za każdym wywołaniem metoda zwróci to co chcemy. Myślę, że poniższy kod wszystko wyjaśnia:
var mockNaszObiekt = new Mock();
mockNaszObiekt.Setup(o => o.JakasMetoda())
.Returns(new Queue<int>(new[] { 1, 2, 3, 4, 5 }).Dequeue);

Sposób prosty, sprytny i bardzo przydatny, więc warto go znać :)

Komentarze (0) - Nikt jeszcze nie komentował - bądź pierwszy!

Imię:
Treść: