Implementazione di un ILogger = come rendere pubblici alcuni campi necessari nell'implementazione specifica di Logger ma non in altri

1

Sto implementando un ILogger personalizzato (interfaccia per la registrazione) Ho sviluppato con successo implementazioni con alcuni famosi logger come Serilog o Log4Net. Ora voglio creare un registratore di memoria, che memorizza tutti i registri all'interno di un elenco (memoria).

Dal momento che la lista esiste solo nel MemoryLogger: ILogger, penso che renderlo parte del contratto di ILogger sarà una soluzione pessima. Ho bisogno di alcune idee su come rendere tale lista accessibile da ILogger perché verrà utilizzata in alcuni Assert nei test di unità, ad esempio. Hai qualche idea? Qualsiasi workAround?

Grazie ragazzi !!

    
posta Badulake 20.04.2018 - 14:15
fonte

3 risposte

7

Non hai bisogno di un'interfaccia per MemoryLogger . Hai solo bisogno di passare quell'istanza nella classe in fase di test. Un caso di test semplificato sarebbe qualcosa del tipo:

public void ShouldLogTraceMessagesForStartStop()
{
    var logger = new MemoryLogger();

    var thingToTest = new LoggingThing(logger);
    thingToTest.DoSomething();

    var traceMessages = logger.Messages.Where(m=>m.Level == Level.Trace).ToList();

    Assert.That(traceMessages.Length).Is(2);
    Assert.That(traceMessages[0]).Contains("start");
    Assert.That(traceMessages[1]).Contains("stop");
}

L'unica cosa che devi fare è che il tuo costruttore prenda il tuo ILogger: LoggingThing(ILogger logger) . Dalla prospettiva di LoggingThing , ha un ILogger ed è perfettamente contento di usarlo come dovrebbe. Dal punto di vista del test unitario, hai un MemoryLogger e puoi richiederlo come vuoi.

Se hai una configurazione di dipendenze come ninject, allora dovrebbe avere un meccanismo per registrare un singleton.

    
risposta data 20.04.2018 - 15:03
fonte
4

I need some ideas about how to make that List accesible from the ILogger because it will be used in some Asserts in unit testing, for example.

Non lo fai. Modificare l'interfaccia in base ai requisiti di una singola implementazione è una cattiva idea. Modificare la visibilità di una classe per il solo test delle unità è anche una cattiva idea. Basta non farlo.

(E in realtà, se stai scrivendo unit test contro l'implementazione, i test * già * sanno che è quella specifica implementazione - perché coinvolgere l'interfaccia?)

    
risposta data 20.04.2018 - 15:04
fonte
-1

Se ho capito bene, stai cercando un modo per LEGGERE i dati registrati.
Questo è qualcosa che non ti serviva prima, quando accedi al file.
Dovresti creare una nuova interfaccia ILoggerRead che espone l'elenco dall'oggetto ILoger.
Con esso sarai in grado di esporre i dati della memoria registrati List GetLoggeddata()
Quindi puoi implementarlo nel tuo registratore di memoria e fare qualsiasi cosa con esso.

    
risposta data 24.04.2018 - 14:56
fonte

Leggi altre domande sui tag