2013-01-16 9 views
18

Muszę kpić z interfejsu, aby zadzwonić do MSMQ, czy istnieje sposób, w jaki mogę użyć Moq do symulacji prawdziwego scenariusza MSMQ, że istnieje 10 wiadomości w kolejce, nazywam się wyśmiewać funkcja 10 razy i mogę uzyskać predefiniowany obiekt, po raz 11 powinienem otrzymać inną wartość zwracaną (np. null)?Moq, aby ustawić powrót funkcji w oparciu o wywołane razy

Odpowiedz

22

Moq ma teraz metodę przedłużacza nazwie SetupSequence() w Moq nazw, co oznacza, można zdefiniować odrębny zwracanej wartości dla każdego konkretnego połączenia.

Ogólną ideą jest to, że po prostu łańcuch żądanych wartości zwracanych. W przykładzie poniżej pierwszego połączenia powróci Joe a drugie wywołanie zwróci Jane:

customerService 
.SetupSequence(s => s.GetCustomerName(It.IsAny<int>())) 
.Returns("Joe") //first call 
.Returns("Jane"); //second call 

trochę więcej informacji here.

+0

To było rzeczywiście to, czego szukałem :) niesamowite. – Silwing

+0

To jeszcze lepiej! – hardywang

+0

Wygląda na to, że link jest nieistotny:/ – reddy

12

czasami użyć prostego licznika do takich scenariuszy:

int callCounter = 0; 
var mock = new Mock<IWhatever>(); 
mock 
    .Setup(mock => mock.SomeMethod()) 
    .Returns(() => 
    { 
     if (callCounter++ < 10) 
     { 
      // do something 
     } 
     else 
     { 
      // do something else 
     } 
    }); 
+2

Dobre rozwiązanie. Możliwe jest również dodanie '.CallBack (...)', gdzie elipsa reprezentuje delegata, który modyfikuje 'callCounter' i ewentualnie inny stan. –

+0

To naprawdę świetny pomysł. – hardywang

2

Można również ustawić oddzielną funkcję, aby to zrobić. Możesz nawet przekazać funkcję parametrowi, jeśli chcesz:

_serviceMock.Setup(x => x.SomeMethod(It.IsAny<String>())).Returns((String param) => getTimesCalled(param)); 
Powiązane problemy