Divergic.Logging.Xunit 1.0.0

Suggested Alternatives

Neovolve.Logging.Xunit

Additional Details

This package has been renamed to Neovolve.Logging.Xunit

There is a newer version of this package available.
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                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Divergic.Logging.Xunit" Version="1.0.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Divergic.Logging.Xunit --version 1.0.0                
#r "nuget: Divergic.Logging.Xunit, 1.0.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// 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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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.1 is deprecated.
4.3.0 436,406 11/21/2023 4.3.0 is deprecated.
4.2.0 1,727,070 8/9/2022 4.2.0 is deprecated.
4.2.0-beta0001 188 8/9/2022 4.2.0-beta0001 is deprecated.
4.1.0 152,879 6/23/2022 4.1.0 is deprecated.
4.1.0-beta0002 192 6/23/2022 4.1.0-beta0002 is deprecated.
4.1.0-beta0001 191 6/22/2022 4.1.0-beta0001 is deprecated.
4.0.0 536,141 1/10/2022 4.0.0 is deprecated.
3.6.1-beta0010 230 1/10/2022 3.6.1-beta0010 is deprecated.
3.6.0 1,210,433 11/13/2020 3.6.0 is deprecated.
3.5.2-beta0019 347 11/13/2020 3.5.2-beta0019 is deprecated.
3.5.2-beta0018 338 11/13/2020 3.5.2-beta0018 is deprecated.
3.5.2-beta0017 335 11/13/2020 3.5.2-beta0017 is deprecated.
3.5.2-beta0016 339 11/13/2020 3.5.2-beta0016 is deprecated.
3.5.2-beta0015 384 11/12/2020 3.5.2-beta0015 is deprecated.
3.5.2-beta0010 342 11/12/2020 3.5.2-beta0010 is deprecated.
3.5.2-beta0006 380 11/10/2020 3.5.2-beta0006 is deprecated.
3.5.2-beta0003 763 10/14/2020 3.5.2-beta0003 is deprecated.
3.5.2-beta0001 15,551 10/12/2020 3.5.2-beta0001 is deprecated.
3.5.1 135,022 10/8/2020 3.5.1 is deprecated.
3.5.1-releasejob0001 584 8/4/2020 3.5.1-releasejob0001 is deprecated.
3.5.1-beta0032 433 10/8/2020 3.5.1-beta0032 is deprecated.
3.5.1-beta0031 365 10/8/2020 3.5.1-beta0031 is deprecated.
3.5.1-beta0030 381 10/8/2020 3.5.1-beta0030 is deprecated.
3.5.1-beta0029 449 9/27/2020 3.5.1-beta0029 is deprecated.
3.5.1-beta0028 385 9/15/2020 3.5.1-beta0028 is deprecated.
3.5.1-beta0027 390 9/9/2020 3.5.1-beta0027 is deprecated.
3.5.1-beta0026 385 9/9/2020 3.5.1-beta0026 is deprecated.
3.5.1-beta0025 386 9/2/2020 3.5.1-beta0025 is deprecated.
3.5.1-beta0024 375 8/21/2020 3.5.1-beta0024 is deprecated.
3.5.1-beta0023 420 8/15/2020 3.5.1-beta0023 is deprecated.
3.5.1-beta0022 426 8/12/2020 3.5.1-beta0022 is deprecated.
3.5.1-beta0021 369 8/12/2020 3.5.1-beta0021 is deprecated.
3.5.1-beta0020 394 8/11/2020 3.5.1-beta0020 is deprecated.
3.5.1-beta0019 423 8/8/2020 3.5.1-beta0019 is deprecated.
3.5.1-beta0018 430 8/8/2020 3.5.1-beta0018 is deprecated.
3.5.1-beta0017 436 8/8/2020 3.5.1-beta0017 is deprecated.
3.5.1-beta0015 406 8/5/2020 3.5.1-beta0015 is deprecated.
3.5.1-beta0013 380 8/4/2020 3.5.1-beta0013 is deprecated.
3.5.1-beta0012 386 8/4/2020 3.5.1-beta0012 is deprecated.
3.5.1-beta0011 400 8/4/2020 3.5.1-beta0011 is deprecated.
3.5.1-beta0010 405 8/2/2020 3.5.1-beta0010 is deprecated.
3.5.1-beta0009 433 7/31/2020 3.5.1-beta0009 is deprecated.
3.5.1-beta0008 437 7/31/2020 3.5.1-beta0008 is deprecated.
3.5.1-beta0007 440 7/31/2020 3.5.1-beta0007 is deprecated.
3.5.1-beta0003 443 7/31/2020 3.5.1-beta0003 is deprecated.
3.5.0 186,057 6/22/2020 3.5.0 is deprecated.
3.5.0-beta0001 409 6/17/2020 3.5.0-beta0001 is deprecated.
3.4.0 118,419 4/28/2020 3.4.0 is deprecated.
3.3.1-beta0004 405 4/28/2020 3.3.1-beta0004 is deprecated.
3.3.0 61,579 3/18/2020 3.3.0 is deprecated.
3.3.0-beta0005 504 3/18/2020 3.3.0-beta0005 is deprecated.
3.2.2-beta0003 2,802 1/12/2020 3.2.2-beta0003 is deprecated.
3.2.2-beta0002 469 1/12/2020 3.2.2-beta0002 is deprecated.
3.2.2-beta0001 464 1/12/2020 3.2.2-beta0001 is deprecated.
3.2.1 224,926 12/18/2019 3.2.1 is deprecated.
3.2.1-beta0001 493 12/18/2019 3.2.1-beta0001 is deprecated.
3.2.0 702 12/18/2019 3.2.0 is deprecated.
3.2.0-beta0002 488 12/18/2019 3.2.0-beta0002 is deprecated.
3.1.0 200,002 9/27/2019 3.1.0 is deprecated.
3.1.0-beta0002 459 9/27/2019 3.1.0-beta0002 is deprecated.
3.0.0 71,171 5/3/2019 3.0.0 is deprecated.
2.2.0 52,838 4/18/2019 2.2.0 is deprecated.
2.2.0-beta0001 517 4/18/2019 2.2.0-beta0001 is deprecated.
2.1.0 1,822 4/14/2019 2.1.0 is deprecated.
2.1.0-beta0003 537 4/14/2019 2.1.0-beta0003 is deprecated.
2.1.0-beta0002 501 4/13/2019 2.1.0-beta0002 is deprecated.
2.0.1-beta0001 553 3/25/2019 2.0.1-beta0001 is deprecated.
2.0.0 47,132 3/19/2019 2.0.0 is deprecated.
1.1.0 53,269 6/3/2018 1.1.0 is deprecated.
1.0.0 9,466 6/1/2018 1.0.0 is deprecated.
0.2.0-beta0047 392 8/5/2020 0.2.0-beta0047 is deprecated.
0.2.0-beta0045 380 8/4/2020 0.2.0-beta0045 is deprecated.
0.2.0-beta0036 389 7/31/2020 0.2.0-beta0036 is deprecated.
0.2.0-beta0035 395 7/31/2020 0.2.0-beta0035 is deprecated.
0.2.0-beta0034 444 6/22/2020 0.2.0-beta0034 is deprecated.