2017-09-17 1 views
2

Ich verwende vs 2017, schreibe eine netcoreapp2.0-Bibliothek, und testet es mit einem UnitTest-Projekt (XUnit und NUnit geben die gleichen Ergebnisse).
Ich habe festgestellt, dass, wenn ich zwangsweise meine Serilog Logger entsorgen, nur die erste Zeile endet in Seq.Nur erste Logging-Shows, außer mit Zwang

Hier sind meine 2 Klassen. Die Bibliothek ein:

public class Class1 
{ 
    public static Logger _log; 

    public Class1(Logger log) 
    { 
     _log = log; 
     _log.Verbose("Class 1 constructor fineshed"); 
    } 

    public void LogMessage(string s) 
    { 
     _log.Debug("Got message: {Message}", s); 
    } 
} 

Und der Unit-Test:

public class UnitTest1 
{ 
    public static Logger _log = new LoggerConfiguration() 
              .WriteTo.Seq("http://localhost:5341", Serilog.Events.LogEventLevel.Verbose) 
              .MinimumLevel.Verbose() 
              .CreateLogger(); 
    [Fact] 
    public void Test1() 
    { 
     _log.Debug("Test 1 logging"); 
     var c = new Class1(_log); 
     c.LogMessage("Logging from test"); 

     _log.Information("Test fineshed"); 

     _log.Dispose(); // Without this, only "Test 1 logging" is logged. 
    } 
} 

referenzierten Assemblys (von Unit-Test-Projekt):

<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0-preview-20170628-02" /> 
<PackageReference Include="serilog" Version="2.5.0" /> 
<PackageReference Include="serilog.sinks.seq" Version="3.3.3" /> 
<PackageReference Include="xunit" Version="2.2.0" /> 
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" /> 

Irgendwelche Vorschläge?

(hier ist ein Link zu einem Demo-Projekt, offen mit vs 2017 die Pakete wieder her und führen Sie den Test: demo project)

Antwort

2

Gemäß Stephen Vorschläge, das Problem war der Lebensbereich des Loggers.

Da ich von einer Komponententestklasse protokolliere, habe ich das Gefühl, dass die Entsorgung des Loggers falsch war, aber die Lösung bestand darin, von der Verwendung eines Klassenvariablenloggers zur Verwendung des statischen globalen Loggers überzugehen.
Das bin ich es einmal auf der Testerstellung einzurichten ermöglicht, und entsorgen Sie es einmal, nachdem alle Tests durchführen:

[SetUpFixture] 
public class TestsSetup 
{ 
    [OneTimeSetUp] 
    public void RunBeforeAnyTests() 
    { 
     Log.Logger = new LoggerConfiguration().Enrich.WithExceptionDetails() 
               .WriteTo.Seq("http://localhost:5341") 
               .MinimumLevel.Verbose() 
               .CreateLogger(); 
    } 

    [OneTimeTearDown] 
    public void RunAfterAnyTests() 
    { 
     Log.CloseAndFlush(); 
    } 
} 

Haupt Verwirrung ich hatte, war, dass die CloseAndFlush auf dem statischen ein solches vorhanden ist, aber nicht auf die ILogger Sie erhalten, wenn man mit

Logger _log = new LoggerConfiguration().... 

daher die Schaffung, warum ich nicht in der Lage war meine Variable eine Schließung und spülen.

+0

Auf der Variablen können Sie einfach 'Dispose()' aufrufen - das ist im Wesentlichen dasselbe wie 'CloseAndFlush()'. HTH! –

+2

@NicholasBlumhardt Es tut es sicherlich. Prost Kumpel. Derzeit läuft der statische Logger für dieses Unit-Test-Projekt gut, so wie ich es gemacht habe, aber es ist gut zu wissen, dass es mit einer Variablen auf eine sehr ähnliche Weise gemacht werden kann. – Noctis

3

Es sieht aus wie Sie in das gleiche Problem laufen as described in this blog post. Die kurze davon ist, dass Sie sind verantwortlich für die Entsorgung Ihres Loggers, der seinen Inhalt in die entsprechende Spüle spült.

+0

Wahr. Wahr. Ich füge auch meine Antwort hinzu, da ich noch etwas mehr Arbeit erledigen musste. – Noctis