E 'possibile/facile simulare i metodi di log di NLog, usando Rhino Mock o simili?È possibile simulare i metodi di log di NLog?
risposta
È possibile solo simulare metodi virtuali. Ma se crei un'interfaccia per la registrazione e la implementi usando NLog puoi usare dependency injection e nei tuoi test usare l'interfaccia mocked per vedere se il sistema sotto test (SUT) sta registrando ciò che ti aspetti che registri.
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));
La semplice risposta è "no". Guardando il codice, l'iniezione di dipendenza non è supportata, il che sembra piuttosto una svista, soprattutto perché non sembra difficile da implementare (a prima vista).
Le uniche interfacce nel progetto sono lì per supportare gli oggetti di interoperabilità COM e alcune altre cose. La classe principale di Logger
non implementa un'interfaccia, né fornisce metodi virtuali.
È possibile fornire un'interfaccia o utilizzare Moles/TypeMock/un altro framework di isolamento per deridere la dipendenza.
Utilizzando Nuget: install-package NLog.Interface
Poi: ILogger = new LoggerAdapter([logger-from-NLog]);
Semplice, ma efficace. Il progetto Github è qui se qualcuno vuole vedere cosa fa: https://github.com/uhaciogullari/NLog.Interface – killthrush
Prova a guardare http://slf.codeplex.com/ – Jon
Vedi post dettagliato [Uso NLog con Dependency Injection] (http: //blog.tonysneed .com/2011/10/09/usando-nlog-con-dipendenza-iniezione /). Il post utilizza NInject come esempio DI. –