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
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.
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
}
});
Buona soluzione. È anche possibile aggiungere '.CallBack (...)' dove i puntini di sospensione rappresentano il delegato che modifica 'callCounter' e probabilmente un altro stato. –
Questa è davvero un'idea geniale. – hardywang
È 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));
Questo era davvero quello che stavo cercando :) fantastico. – Silwing
Questo è ancora meglio! – hardywang
Sembra che il collegamento sia irrilevante:/ – reddy