Divergic.Logging.Xunit
1.0.0
This package has been renamed to Neovolve.Logging.Xunit
See the version list below for details.
dotnet add package Divergic.Logging.Xunit --version 1.0.0
NuGet\Install-Package Divergic.Logging.Xunit -Version 1.0.0
<PackageReference Include="Divergic.Logging.Xunit" Version="1.0.0" />
paket add Divergic.Logging.Xunit --version 1.0.0
#r "nuget: Divergic.Logging.Xunit, 1.0.0"
// Install Divergic.Logging.Xunit as a Cake Addin #addin nuget:?package=Divergic.Logging.Xunit&version=1.0.0 // Install Divergic.Logging.Xunit as a Cake Tool #tool nuget:?package=Divergic.Logging.Xunit&version=1.0.0
Introduction
Divergic.Logging.Xunit is a NuGet package that returns an ILogger
or ILogger<T>
provider that wraps around the ITestOutputHelper
supplied by xUnit. xUnit uses this helper to write log messages to the test output of each test execution. This means that any log messages from classes being tested will end up in the xUnit test result output.
Installation
Run the following in the NuGet command line or visit the NuGet package page.
Install-Package Divergic.Logging.Xunit
Usage
The common usage of this package is to call the BuildLogger
extension method on the xUnit ITestOutputHelper
.
using System;
using FluentAssertions;
using Microsoft.Extensions.Logging;
using Xunit;
using Xunit.Abstractions;
public class MyClass
{
private readonly ILogger _logger;
public MyClass(ILogger logger)
{
_logger = logger;
}
public string DoSomething()
{
_logger.LogInformation("Hey, we did something");
return Guid.NewGuid().ToString();
}
}
public class MyClassTests
{
private readonly ITestOutputHelper _output;
private readonly ILogger _logger;
public MyClassTests(ITestOutputHelper output)
{
_output = output;
_logger = output.BuildLogger();
}
[Fact]
public void DoSomethingReturnsValueTest()
{
var sut = new MyClass(_logger);
var actual = sut.DoSomething();
// The xUnit test output should now include the log message from MyClass.DoSomething()
actual.Should().NotBeNullOrWhiteSpace();
}
}
This would output the following in the test results.
Information [0]: Hey, we did something
Support for ILogger<T>
is there using the BuildLoggerFor<T>
extension method.
using System;
using FluentAssertions;
using Microsoft.Extensions.Logging;
using Xunit;
using Xunit.Abstractions;
public class MyClassTests
{
private readonly ITestOutputHelper _output;
private readonly ILogger<MyClass> _logger;
public MyClassTests(ITestOutputHelper output)
{
_output = output;
_logger = output.BuildLoggerFor<MyClass>();
}
[Fact]
public void DoSomethingReturnsValueTest()
{
var sut = new MyClass(_logger);
var actual = sut.DoSomething();
// The xUnit test output should now include the log message from MyClass.DoSomething()
actual.Should().NotBeNull();
}
}
Inspection
Using this library makes it really easy to output log messages from your code as part of the test results. You may want to also inspect the log messages written as part of the test assertions as well.
The BuildLogger
and BuildLoggerFor<T>
extension methods support this by returning a ICacheLogger
or ICacheLogger<T>
respectively. The cache logger is a wrapper around the created logger and exposes all the log entries written by the test.
using System;
using Divergic.Logging.Xunit;
using FluentAssertions;
using Microsoft.Extensions.Logging;
using Xunit;
using Xunit.Abstractions;
public class MyClassTests
{
private readonly ITestOutputHelper _output;
private readonly ICacheLogger _logger;
public MyClassTests(ITestOutputHelper output)
{
_output = output;
_logger = output.BuildLogger();
}
[Fact]
public void DoSomethingReturnsValueTest()
{
var sut = new MyClass(_logger);
sut.DoSomething();
_logger.Count.Should().Be(1);
_logger.Entries.Should().HaveCount(1);
_logger.Last.Message.Should().Be("Hey, we did something");
}
}
Perhaps you don't want to use the xUnit ITestOutputHelper
but still want to use the ICacheLogger
to run assertions over log messages written by the class under test. You can do this by creating a CacheLogger
of CacheLogger<T>
directly.
using System;
using Divergic.Logging.Xunit;
using FluentAssertions;
using Microsoft.Extensions.Logging;
using Xunit;
public class MyClassTests
{
[Fact]
public void DoSomethingReturnsValueTest()
{
var logger = new CacheLogger();
var sut = new MyClass(_logger);
sut.DoSomething();
logger.Count.Should().Be(1);
logger.Entries.Should().HaveCount(1);
logger.Last.Message.Should().Be("Hey, we did something");
}
}
Configured LoggerFactory
You may have an integration or acceptance test that requires additional configuration to the log providers on ILoggerFactory
while also supporting the logging out to xUnit test results. You can do this by create a factory that is already configured with xUnit support.
using System;
using Divergic.Logging.Xunit;
using FluentAssertions;
using Microsoft.Extensions.Logging;
using Xunit;
using Xunit.Abstractions;
public class MyClassTests
{
private readonly ILogger _logger;
public MyClassTests(ITestOutputHelper output)
{
var factory = LogFactory.Create(output);
// call factory.UseConsole or other provider extension method
_logger = factory.CreateLogger(nameof(MyClassTests));
}
[Fact]
public void DoSomethingReturnsValueTest()
{
var sut = new MyClass(_logger);
// The xUnit test output should now include the log message from MyClass.DoSomething()
var actual = sut.DoSomething();
actual.Should().NotBeNullOrWhiteSpace();
}
}
Existing Loggers
Already have an existing logger and want the above cache support? Got you covered there too using the WithCache()
method.
using System;
using Divergic.Logging.Xunit;
using FluentAssertions;
using Microsoft.Extensions.Logging;
using NSubstitute;
using Xunit;
public class MyClassTests
{
[Fact]
public void DoSomethingReturnsValueTest()
{
var logger = Substitute.For<ILogger>();
logger.IsEnabled(Arg.Any<LogLevel>()).Returns(true);
var cacheLogger = logger.WithCache();
var sut = new MyClass(cacheLogger);
sut.DoSomething();
cacheLogger.Count.Should().Be(1);
cacheLogger.Entries.Should().HaveCount(1);
cacheLogger.Last.Message.Should().Be("Hey, we did something");
}
}
The WithCache()
also supports ILogger<T>
.
using System;
using Divergic.Logging.Xunit;
using FluentAssertions;
using Microsoft.Extensions.Logging;
using NSubstitute;
using Xunit;
public class MyClassTests
{
[Fact]
public void DoSomethingReturnsValueTest()
{
var logger = Substitute.For<ILogger<MyClass>>();
logger.IsEnabled(Arg.Any<LogLevel>()).Returns(true);
var cacheLogger = logger.WithCache();
var sut = new MyClass(cacheLogger);
sut.DoSomething();
cacheLogger.Count.Should().Be(1);
cacheLogger.Entries.Should().HaveCount(1);
cacheLogger.Last.Message.Should().Be("Hey, we did something");
}
}
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Ensure.That (>= 8.0.0)
- Microsoft.Extensions.Logging (>= 2.1.0)
- Xunit.Abstractions (>= 2.0.1)
NuGet packages (6)
Showing the top 5 NuGet packages that depend on Divergic.Logging.Xunit:
Package | Downloads |
---|---|
AutoMoqFixture
Package Description |
|
U2U.EntityFrameworkCore.Testing
Package Description |
|
InsonusK.Xunit.ExpectationsTest
Base class of Xunit test expectation methods support |
|
Reductech.Sequence.Core.TestHarness
Class library for automatically testing Sequence® Core steps. |
|
HerrGeneral.Test.Extension
Helper methods for HerrGeneral testing |
GitHub repositories (8)
Showing the top 5 popular GitHub repositories that depend on Divergic.Logging.Xunit:
Repository | Stars |
---|---|
bitwarden/server
Bitwarden infrastructure/backend (API, database, Docker, etc).
|
|
JasperFx/marten
.NET Transactional Document DB and Event Store on PostgreSQL
|
|
asynkron/protoactor-dotnet
Proto Actor - Ultra fast distributed actors for Go, C# and Java/Kotlin
|
|
imperugo/StackExchange.Redis.Extensions
|
|
sethreno/schemazen
Script and create SQL Server objects quickly
|
Version | Downloads | Last updated | |
---|---|---|---|
4.3.1 | 164,037 | 4/20/2024 | |
4.3.0 | 436,406 | 11/21/2023 | |
4.2.0 | 1,727,070 | 8/9/2022 | |
4.2.0-beta0001 | 188 | 8/9/2022 | |
4.1.0 | 152,879 | 6/23/2022 | |
4.1.0-beta0002 | 192 | 6/23/2022 | |
4.1.0-beta0001 | 191 | 6/22/2022 | |
4.0.0 | 536,141 | 1/10/2022 | |
3.6.1-beta0010 | 230 | 1/10/2022 | |
3.6.0 | 1,210,433 | 11/13/2020 | |
3.5.2-beta0019 | 347 | 11/13/2020 | |
3.5.2-beta0018 | 338 | 11/13/2020 | |
3.5.2-beta0017 | 335 | 11/13/2020 | |
3.5.2-beta0016 | 339 | 11/13/2020 | |
3.5.2-beta0015 | 384 | 11/12/2020 | |
3.5.2-beta0010 | 342 | 11/12/2020 | |
3.5.2-beta0006 | 380 | 11/10/2020 | |
3.5.2-beta0003 | 763 | 10/14/2020 | |
3.5.2-beta0001 | 15,551 | 10/12/2020 | |
3.5.1 | 135,022 | 10/8/2020 | |
3.5.1-releasejob0001 | 584 | 8/4/2020 | |
3.5.1-beta0032 | 433 | 10/8/2020 | |
3.5.1-beta0031 | 365 | 10/8/2020 | |
3.5.1-beta0030 | 381 | 10/8/2020 | |
3.5.1-beta0029 | 449 | 9/27/2020 | |
3.5.1-beta0028 | 385 | 9/15/2020 | |
3.5.1-beta0027 | 390 | 9/9/2020 | |
3.5.1-beta0026 | 385 | 9/9/2020 | |
3.5.1-beta0025 | 386 | 9/2/2020 | |
3.5.1-beta0024 | 375 | 8/21/2020 | |
3.5.1-beta0023 | 420 | 8/15/2020 | |
3.5.1-beta0022 | 426 | 8/12/2020 | |
3.5.1-beta0021 | 369 | 8/12/2020 | |
3.5.1-beta0020 | 394 | 8/11/2020 | |
3.5.1-beta0019 | 423 | 8/8/2020 | |
3.5.1-beta0018 | 430 | 8/8/2020 | |
3.5.1-beta0017 | 436 | 8/8/2020 | |
3.5.1-beta0015 | 406 | 8/5/2020 | |
3.5.1-beta0013 | 380 | 8/4/2020 | |
3.5.1-beta0012 | 386 | 8/4/2020 | |
3.5.1-beta0011 | 400 | 8/4/2020 | |
3.5.1-beta0010 | 405 | 8/2/2020 | |
3.5.1-beta0009 | 433 | 7/31/2020 | |
3.5.1-beta0008 | 437 | 7/31/2020 | |
3.5.1-beta0007 | 440 | 7/31/2020 | |
3.5.1-beta0003 | 443 | 7/31/2020 | |
3.5.0 | 186,057 | 6/22/2020 | |
3.5.0-beta0001 | 409 | 6/17/2020 | |
3.4.0 | 118,419 | 4/28/2020 | |
3.3.1-beta0004 | 405 | 4/28/2020 | |
3.3.0 | 61,579 | 3/18/2020 | |
3.3.0-beta0005 | 504 | 3/18/2020 | |
3.2.2-beta0003 | 2,802 | 1/12/2020 | |
3.2.2-beta0002 | 469 | 1/12/2020 | |
3.2.2-beta0001 | 464 | 1/12/2020 | |
3.2.1 | 224,926 | 12/18/2019 | |
3.2.1-beta0001 | 493 | 12/18/2019 | |
3.2.0 | 702 | 12/18/2019 | |
3.2.0-beta0002 | 488 | 12/18/2019 | |
3.1.0 | 200,002 | 9/27/2019 | |
3.1.0-beta0002 | 459 | 9/27/2019 | |
3.0.0 | 71,171 | 5/3/2019 | |
2.2.0 | 52,838 | 4/18/2019 | |
2.2.0-beta0001 | 517 | 4/18/2019 | |
2.1.0 | 1,822 | 4/14/2019 | |
2.1.0-beta0003 | 537 | 4/14/2019 | |
2.1.0-beta0002 | 501 | 4/13/2019 | |
2.0.1-beta0001 | 553 | 3/25/2019 | |
2.0.0 | 47,132 | 3/19/2019 | |
1.1.0 | 53,269 | 6/3/2018 | |
1.0.0 | 9,466 | 6/1/2018 | |
0.2.0-beta0047 | 392 | 8/5/2020 | |
0.2.0-beta0045 | 380 | 8/4/2020 | |
0.2.0-beta0036 | 389 | 7/31/2020 | |
0.2.0-beta0035 | 395 | 7/31/2020 | |
0.2.0-beta0034 | 444 | 6/22/2020 |