c# - .net core 2.0 ConfigureLogging xunit test -


in xunit integration test in .net core 2.0 project cannot see log messages in terminal prints test results. when code run in webhost environment, logs printed out console.

this how configure logging in test's constructor:

var config = new configurationbuilder()     .addjsonfile("appsettings.tests.json")     .build();  var services = new servicecollection();  services.addlogging(options => {     options.addconfiguration(config.getsection("logging"));     options.addconsole();     options.adddebug(); });  var serviceprovider = services.buildserviceprovider(); var loggerfactory = serviceprovider.getservice<iloggerfactory>(); var logger = loggerfactory.createlogger("test"); logger.logerror("from ctor"); 

but don't see log message.

xunit has changed in version 2 no longer capture standard output tests:

if used xunit.net 1.x, may have been writing output console, debug, or trace. when xunit.net v2 shipped parallelization turned on default, output capture mechanism no longer appropriate; impossible know of many tests running in parallel responsible writing shared resources.

instead, supposed use an explicit mechanism 2 write test output. basically, instead of writing console, writing special itestoutputhelper.

of course, output mechanism not supported default asp.net core logging. fortunately, writing logging provider test output isn’t difficult. i’ve implemented quick provider , included in answer below. can use this:

public class example {     private readonly ilogger<example> _logger;      public example(itestoutputhelper testoutputhelper)     {         var loggerfactory = new loggerfactory();         loggerfactory.addprovider(new xunitloggerprovider(testoutputhelper));         _logger = loggerfactory.createlogger<example>();     }      [fact]     public void test()     {         _logger.logdebug("foo bar baz");     } } 

note should avoid creating complete dependency injection container in unit tests. having di in unit tests sign unit test not unit test instead integration test. in unit test, should test 1 particular unit , pass dependencies explicitly—more mock. can see in example above, creating logger simple thing without di.


as promised, xunitloggerprovider , xunitlogger need run code shown above, , integrate microsoft.extensions.logging framework xunit test output:

public class xunitloggerprovider : iloggerprovider {     private readonly itestoutputhelper _testoutputhelper;      public xunitloggerprovider(itestoutputhelper testoutputhelper)     {         _testoutputhelper = testoutputhelper;     }      public ilogger createlogger(string categoryname)         => new xunitlogger(_testoutputhelper, categoryname);      public void dispose()     { } }  public class xunitlogger : ilogger {     private readonly itestoutputhelper _testoutputhelper;     private readonly string _categoryname;      public xunitlogger(itestoutputhelper testoutputhelper, string categoryname)     {         _testoutputhelper = testoutputhelper;         _categoryname = categoryname;     }      public idisposable beginscope<tstate>(tstate state)         => noopdisposable.instance;      public bool isenabled(loglevel loglevel)         => true;      public void log<tstate>(loglevel loglevel, eventid eventid, tstate state, exception exception, func<tstate, exception, string> formatter)     {         _testoutputhelper.writeline($"{_categoryname} [{eventid}] {formatter(state, exception)}");         if (exception != null)             _testoutputhelper.writeline(exception.tostring());     }      private class noopdisposable : idisposable     {         public static noopdisposable instance = new noopdisposable();         public void dispose()         { }     } } 

Comments

Popular posts from this blog

angular - Ionic slides - dynamically add slides before and after -

minify - Minimizing css files -

Add a dynamic header in angular 2 http provider -