diff --git a/docs/docs/library/xunit-extensions.md b/docs/docs/library/xunit-extensions.md index ede0bf6..18910eb 100644 --- a/docs/docs/library/xunit-extensions.md +++ b/docs/docs/library/xunit-extensions.md @@ -40,4 +40,13 @@ public class ThingamajigTests _output.WriteLogs(logProvider.GetAllLogEntries()) } } -``` \ No newline at end of file +``` + +#### Variants + +* `ITestOutputHelper.WriteLogs(ITestCaptureLogger logger, Func? formatter = null)` + * Available from v3.0 + * Takes an `ITestCaptureLogger` and outputs all of the log messages captured by that logger. +* `ITestOutputHelper.WriteLogs(TestCaptureLoggerProvider provider, Func? formatter = null)` + * Available from v3.0 + * Takes an `TestCaptureLoggerProvider` and outputs all of the log messages captured by all the loggers in the provider. diff --git a/release-notes/wip-release-notes.md b/release-notes/wip-release-notes.md index 23e45f3..c6254cb 100644 --- a/release-notes/wip-release-notes.md +++ b/release-notes/wip-release-notes.md @@ -15,6 +15,9 @@ Date: ??? - #123: `TestCaptureLoggerProvider.CreateLogger()` - Potential breaking change: `TestCaptureLogger` no longer inherits from `TestCaptureLogger`. - Add `ITestCaptureLogger` and have `TestCaptureLogger` and `TestCaptureLogger` be concrete implementations of the interface so you can reference the interface and not care which concrete implementation you have. +- #170: Additional xunit extension methods to write out all log messages to the `ITestOutputHelper`. + - `ITestOutputHelper.WriteLogs(ITestCaptureLogger...)` + - `ITestOutputHelper.WriteLogs(TestCaptureLoggerProvider...)` ### Miscellaneous diff --git a/src/Stravaig.Extensions.Logging.Diagnostics.Tests/XUnit/OutputTestHelperExtensionsTests.cs b/src/Stravaig.Extensions.Logging.Diagnostics.Tests/XUnit/OutputTestHelperExtensionsTests.cs index 464fbcc..5681188 100644 --- a/src/Stravaig.Extensions.Logging.Diagnostics.Tests/XUnit/OutputTestHelperExtensionsTests.cs +++ b/src/Stravaig.Extensions.Logging.Diagnostics.Tests/XUnit/OutputTestHelperExtensionsTests.cs @@ -26,7 +26,7 @@ public void WriteLine(string format, params object[] args) } [Test] - public void RenderedLogMessagesGetSentToOutputTestHelper() + public void RenderedLogEntryMessagesSentToOutputTestHelper() { ResetLogSequence(); var outputHelper = new OutputHelper(); @@ -36,11 +36,47 @@ public void RenderedLogMessagesGetSentToOutputTestHelper() var logs = logger.GetLogs(); outputHelper.WriteLogs(logs); - + + outputHelper.Messages[0].ShouldBe("[0 Information Stravaig.Extensions.Logging.Diagnostics.Tests.XUnit.OutputTestHelperExtensionTests] This is an information Message."); + outputHelper.Messages[1].ShouldBe("[1 Information Stravaig.Extensions.Logging.Diagnostics.Tests.XUnit.OutputTestHelperExtensionTests] This is a Warning Message."); + } + + [Test] + public void RenderedLoggerSentToOutputTestHelper() + { + ResetLogSequence(); + var outputHelper = new OutputHelper(); + var logger = new TestCaptureLogger(); + logger.LogInformation("This is an information Message."); + logger.LogInformation("This is a Warning Message."); + + outputHelper.WriteLogs(logger); + outputHelper.Messages[0].ShouldBe("[0 Information Stravaig.Extensions.Logging.Diagnostics.Tests.XUnit.OutputTestHelperExtensionTests] This is an information Message."); outputHelper.Messages[1].ShouldBe("[1 Information Stravaig.Extensions.Logging.Diagnostics.Tests.XUnit.OutputTestHelperExtensionTests] This is a Warning Message."); } + [Test] + public void RenderedLoggerProviderSentToOutputTestHelper() + { + ResetLogSequence(); + var outputHelper = new OutputHelper(); + var loggerProvider = new TestCaptureLoggerProvider(); + var logger1 = loggerProvider.CreateLogger("logger1"); + var logger2 = loggerProvider.CreateLogger("logger2"); + logger1.LogInformation("This is an information Message on the first logger."); + logger2.LogInformation("This is an information Message on the second logger."); + logger2.LogWarning("This is a Warning Message on the second logger."); + logger1.LogWarning("This is a Warning Message on the first logger."); + + outputHelper.WriteLogs(loggerProvider); + + outputHelper.Messages[0].ShouldBe("[0 Information logger1] This is an information Message on the first logger."); + outputHelper.Messages[1].ShouldBe("[1 Information logger2] This is an information Message on the second logger."); + outputHelper.Messages[2].ShouldBe("[2 Warning logger2] This is a Warning Message on the second logger."); + outputHelper.Messages[3].ShouldBe("[3 Warning logger1] This is a Warning Message on the first logger."); + } + private void ResetLogSequence() { var logEntryType = typeof(LogEntry); @@ -49,4 +85,4 @@ private void ResetLogSequence() throw new InvalidOperationException("Expected LogEntry to have a private field called _sequence."); field.SetValue(null, 0); } -} \ No newline at end of file +} diff --git a/src/Stravaig.Extensions.Logging.Diagnostics.XUnit/OutputTestHelperExtensions.cs b/src/Stravaig.Extensions.Logging.Diagnostics.XUnit/OutputTestHelperExtensions.cs index e13fcc8..03bd882 100644 --- a/src/Stravaig.Extensions.Logging.Diagnostics.XUnit/OutputTestHelperExtensions.cs +++ b/src/Stravaig.Extensions.Logging.Diagnostics.XUnit/OutputTestHelperExtensions.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Microsoft.Extensions.Logging; using Stravaig.Extensions.Logging.Diagnostics.Render; using Xunit.Abstractions; @@ -15,9 +16,27 @@ public static class OutputTestHelperExtensions /// /// The xunit test output helper. /// The log entries. - /// + /// An optional formatter that defines how the log entry is to be written. public static void WriteLogs(this ITestOutputHelper output, IEnumerable logEntries, Func? formatter = null) { logEntries.RenderLogs(formatter ?? Formatter.SimpleBySequence, output.WriteLine); } -} \ No newline at end of file + + /// + /// Write the logs to the xunit test output helper. + /// + /// The xunit test output helper. + /// The logger from which to output the captured logs. + /// An optional formatter that defines how the log entry is to be written. + public static void WriteLogs(this ITestOutputHelper output, ITestCaptureLogger logger, Func? formatter = null) + => output.WriteLogs(logger.GetLogs(), formatter); + + /// + /// Write the logs to the xunit test output helper. + /// + /// The xunit test output helper. + /// The log provider from which to output the captured logs. + /// An optional formatter that defines how the log entry is to be written. + public static void WriteLogs(this ITestOutputHelper output, TestCaptureLoggerProvider provider, Func? formatter = null) + => output.WriteLogs(provider.GetAllLogEntries(), formatter); +}