Sto usando Moq per verificare se un metodo viene chiamato nel mio unittest. In questo caso specifico voglio testare se il metodo in prova registra un errore tramite log4net. Il problema è che ciò può essere fatto chiamando log.Error
o log.ErrorFormat
. O va bene.Come posso verificare se uno dei due metodi è stato chiamato?
Come posso verificare questo? So solo come verificare che siano stati entrambi chiamati.
var logMock = new Mock<ILog>();
var myClass = new MyClass(logMock.Object);
myClass.MyMethod();
logMock.Verify(log => log.Error(It.IsAny<object>()));
logMock.Verify(log => log.ErrorFormat(It.IsAny<string>(), It.IsAny<object>()));
Ora che ci penso, entrambi hanno un mucchio di sovraccarichi, non mi importa se uno qualsiasi dei sovraccarichi sono chiamati sia (sto iniziando a dubitare che questo è un buon test).
Grazie in anticipo.
EDIT: ho pensato a qualcosa di brutto:
try
{
logMock.Verify(log => log.Error(It.IsAny<object>()));
}
catch (Moq.MockException ex)
{
logMock.Verify(log => log.ErrorFormat(It.IsAny<string>(), It.IsAny<object>()));
}
forse posso avvolgere questo in una sorta di metodo di estensione ... per esempio VerifyAny
.
La mia versione di VerifyAny era circa la stessa, tranne che non ho pensa al vincolo del tipo e raccogli le eccezioni. L'utilizzo è in realtà un po 'più pulito rispetto all'approccio CallBack. Oppure la cattura di eccezioni come quella è una cattiva idea? Hmmm .... –
@MatthijsWessels La cattura di eccezioni attese come quella sembra un po 'sporca, ma per un progetto di unit test non mi preoccuperei troppo delle prestazioni. Forse sarebbe meglio avere un metodo 'Mock .SetupAny' invece che inietti i callback e restituisca un bool. –