Używam Moq do sprawdzenia, czy metoda jest wywoływana w moim unittest. W tym konkretnym przypadku chcę przetestować, czy testowana metoda rejestruje błąd przez log4net. Problem polega na tym, że można to zrobić, dzwoniąc pod numer log.Error
lub log.ErrorFormat
. Albo jest w porządku.Jak sprawdzić, czy została wywołana jedna z dwóch metod?
Jak mogę to jednak zweryfikować? Wiem tylko, jak sprawdzić, czy obaj zostali nazwani.
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>()));
Teraz, gdy myślę o tym, że obie mają kilka przeciążeń, nie mam nic przeciwko temu, jeśli któryś z przeciążeniami nazywane są albo (Zaczynam wątpić, że jest to dobry test).
Z góry dziękuję.
EDIT: Właśnie myślałem o czymś złośliwym:
try
{
logMock.Verify(log => log.Error(It.IsAny<object>()));
}
catch (Moq.MockException ex)
{
logMock.Verify(log => log.ErrorFormat(It.IsAny<string>(), It.IsAny<object>()));
}
Może mogę owinąć to w jakiś sposób ... np wydłużania VerifyAny
.
Moja wersja VerifyAny była prawie taka sama, z wyjątkiem, że nie pomyśl o ograniczeniu typu i zbieraniu wyjątków. Używanie jest w rzeczywistości nieco czystsze niż podejście CallBack. A może złapanie wyjątków to zły pomysł? Hmmm .... –
@MatthijsWessels Łapanie oczekiwanych wyjątków, takich jak to, wydaje się trochę brzydkie, ale dla projektu testów jednostkowych nie przejmowałbym się zbytnio występem. Być może byłoby lepiej mieć zamiast tego metodę "Mock .SetupAny", która wstrzykuje wywołania zwrotne i zwraca wartość logiczną. –