Czy można/łatwo kpić z metod dziennika NLog, używając Rhino Mocks lub podobnego?Czy można udawać metody log NLog?
Odpowiedz
Można kpić tylko z wirtualnych metod. Ale jeśli utworzysz interfejs do rejestrowania, a następnie zaimplementujesz go za pomocą NLog Możesz użyć iniekcji zależności, aw swoich testach użyj wyśmiewanego interfejsu, aby sprawdzić, czy testowany system (SUT) rejestruje to, czego oczekujesz od logowania.
public class SUT
{
private readonly ILogger logger;
SUT(ILogger logger) { this.logger = logger;}
MethodUnderTest() {
// ...
logger.LogSomething();
// ...
}
}
// and in tests
var mockLogger = new MockLogger();
var sut = new SUT(mockLogger);
sut.MethodUnderTest();
Assert.That("Expected log message", Is.Equal.To(mockLogger.LastLoggedMessage));
Prostą odpowiedzią jest "nie". Patrząc na kod, zastrzyk zależności nie jest obsługiwany, co wydaje się raczej niedopatrzeniem, zwłaszcza że nie wydaje się trudne do wdrożenia (na pierwszy rzut oka).
Jedynymi interfejsami w projekcie są obiekty COM Interop i kilka innych rzeczy. Główna klasa betonu Logger
nie implementuje interfejsu ani nie dostarcza wirtualnych metod.
Użytkownik może albo udostępnić interfejs samodzielnie, albo użyć Moles/TypeMock/innego frameworka izolacji, aby kpić z zależności.
Korzystanie Nuget: install-package NLog.Interface
Następnie: ILogger = new LoggerAdapter([logger-from-NLog]);
Proste, ale skuteczne. Projekt Github jest tutaj, jeśli ktoś chce zobaczyć, co robi: https://github.com/uhaciogullari/NLog.Interface – killthrush
Spróbuj patrząc na http://slf.codeplex.com/ – Jon
Zobacz szczegółowy wpis [Korzystanie NLog z Dependency Injection] (http: //blog.tonysneed .com/2011/10/09/using-nlog-with-dependency-injection /). Post wykorzystuje NInject jako przykład DI. –