2013-01-16 5 views
18

Ho bisogno di simulare un'interfaccia per chiamare a MSMQ, c'è un modo in cui posso usare Moq per simulare lo scenario MSMQ reale che ci sono 10 messaggi in coda, chiamo mocked funzione 10 volte e posso ottenere un oggetto predefinito, l'undicesima volta dovrei ottenere un valore di ritorno diverso (ad es. null)?Moq per impostare un ritorno di funzione in base agli orari chiamati

risposta

22

Moq ora ha un metodo estensione chiamato SetupSequence() nello spazio Moq che significa che è possibile definire un valore di ritorno distinta per ogni chiamata specifico.

L'idea generale è quella di collegare solo i valori di ritorno necessari. Nell'esempio qui sotto la prima chiamata tornerà Joe e la seconda chiamata tornerà Jane:

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

qualche info in più here.

+0

Questo era davvero quello che stavo cercando :) fantastico. – Silwing

+0

Questo è ancora meglio! – hardywang

+0

Sembra che il collegamento sia irrilevante:/ – reddy

12

a volte utilizzare un semplice contatore per tali scenari:

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

Buona soluzione. È anche possibile aggiungere '.CallBack (...)' dove i puntini di sospensione rappresentano il delegato che modifica 'callCounter' e probabilmente un altro stato. –

+0

Questa è davvero un'idea geniale. – hardywang

2

È anche possibile impostare una funzione separata per eseguire questa operazione. È anche possibile passare la funzione di un parametro se lo si desidera:

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