diff --git a/WireMock.Net Solution.sln b/WireMock.Net Solution.sln
index 5420b0234..76244631d 100644
--- a/WireMock.Net Solution.sln
+++ b/WireMock.Net Solution.sln
@@ -101,6 +101,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.WebApplication
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.Console.Proxy.NETCoreApp", "examples\WireMock.Net.Console.Proxy.NETCoreApp\WireMock.Net.Console.Proxy.NETCoreApp.csproj", "{670C7562-C154-442E-A249-7D26849BCD13}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.xUnit", "src\WireMock.Net.xUnit\WireMock.Net.xUnit.csproj", "{0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -239,6 +241,10 @@ Global
{670C7562-C154-442E-A249-7D26849BCD13}.Debug|Any CPU.Build.0 = Debug|Any CPU
{670C7562-C154-442E-A249-7D26849BCD13}.Release|Any CPU.ActiveCfg = Release|Any CPU
{670C7562-C154-442E-A249-7D26849BCD13}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -279,6 +285,7 @@ Global
{2215055B-594E-4C2F-99B2-6DF337F02893} = {985E0ADB-D4B4-473A-AA40-567E279B7946}
{3F7AA023-6833-4856-A08A-4B5717B592B8} = {985E0ADB-D4B4-473A-AA40-567E279B7946}
{670C7562-C154-442E-A249-7D26849BCD13} = {985E0ADB-D4B4-473A-AA40-567E279B7946}
+ {0DE0954F-8C00-4E8D-B94A-4361FC1CBE44} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {DC539027-9852-430C-B19F-FD035D018458}
diff --git a/WireMock.Net Solution.sln.DotSettings b/WireMock.Net Solution.sln.DotSettings
index 68011e7b1..b54c5d82d 100644
--- a/WireMock.Net Solution.sln.DotSettings
+++ b/WireMock.Net Solution.sln.DotSettings
@@ -25,4 +25,5 @@
True
True
True
+ True
\ No newline at end of file
diff --git a/src/WireMock.Net.xUnit/TestOutputHelperWireMockLogger.cs b/src/WireMock.Net.xUnit/TestOutputHelperWireMockLogger.cs
new file mode 100644
index 000000000..e084fa82c
--- /dev/null
+++ b/src/WireMock.Net.xUnit/TestOutputHelperWireMockLogger.cs
@@ -0,0 +1,79 @@
+using System;
+using Newtonsoft.Json;
+using Stef.Validation;
+using WireMock.Admin.Requests;
+using WireMock.Logging;
+using Xunit.Abstractions;
+
+namespace WireMock.Net.Xunit;
+
+///
+/// When using xUnit, this class enables to log the output from WireMock.Net to the .
+///
+public sealed class TestOutputHelperWireMockLogger : IWireMockLogger
+{
+ private readonly ITestOutputHelper _testOutputHelper;
+
+ ///
+ /// Create a new instance on the .
+ ///
+ /// Represents a class which can be used to provide test output.
+ public TestOutputHelperWireMockLogger(ITestOutputHelper testOutputHelper)
+ {
+ _testOutputHelper = Guard.NotNull(testOutputHelper);
+ }
+
+ ///
+ public void Debug(string formatString, params object[] args)
+ {
+ _testOutputHelper.WriteLine(Format("Debug", formatString, args));
+ }
+
+ ///
+ public void Info(string formatString, params object[] args)
+ {
+ _testOutputHelper.WriteLine(Format("Info", formatString, args));
+ }
+
+ ///
+ public void Warn(string formatString, params object[] args)
+ {
+ _testOutputHelper.WriteLine(Format("Warning", formatString, args));
+ }
+
+ ///
+ public void Error(string formatString, params object[] args)
+ {
+ _testOutputHelper.WriteLine(Format("Error", formatString, args));
+ }
+
+ ///
+ public void Error(string formatString, Exception exception)
+ {
+ _testOutputHelper.WriteLine(Format("Error", formatString, exception.Message));
+
+ if (exception is AggregateException ae)
+ {
+ ae.Handle(ex =>
+ {
+ _testOutputHelper.WriteLine(Format("Error", "Exception {0}", ex.Message));
+ return true;
+ });
+ }
+ }
+
+ ///
+ public void DebugRequestResponse(LogEntryModel logEntryModel, bool isAdminRequest)
+ {
+ var message = JsonConvert.SerializeObject(logEntryModel, Formatting.Indented);
+ _testOutputHelper.WriteLine(Format("DebugRequestResponse", "Admin[{0}] {1}", isAdminRequest, message));
+ }
+
+ private static string Format(string level, string formatString, params object[] args)
+ {
+ Guard.NotNull(formatString);
+
+ var message = args.Length > 0 ? string.Format(formatString, args) : formatString;
+ return $"{DateTime.UtcNow} [{level}] : {message}";
+ }
+}
\ No newline at end of file
diff --git a/src/WireMock.Net.xUnit/WireMock.Net.xUnit.csproj b/src/WireMock.Net.xUnit/WireMock.Net.xUnit.csproj
new file mode 100644
index 000000000..198b9932d
--- /dev/null
+++ b/src/WireMock.Net.xUnit/WireMock.Net.xUnit.csproj
@@ -0,0 +1,37 @@
+
+
+ Some extensions for xUnit (ITestOutputHelper)
+ WireMock.Net.xUnit
+ Stef Heyenrath
+ net45;net451;netstandard1.0;netstandard2.0;netstandard2.1
+ true
+ WireMock.Net.xUnit
+ WireMock.Net.Xunit
+ WireMock.Net.xUnit
+ tdd;wiremock;test;unittest;xunit
+ {0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}
+ true
+ $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb
+ true
+ true
+ true
+ true
+ ../WireMock.Net/WireMock.Net.snk
+ true
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj b/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj
index 7cd64f1bb..86e04868f 100644
--- a/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj
+++ b/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj
@@ -28,6 +28,7 @@
+
diff --git a/test/WireMock.Net.Tests/WireMockServerTests.cs b/test/WireMock.Net.Tests/WireMockServerTests.cs
index 07d36fdf8..740680169 100644
--- a/test/WireMock.Net.Tests/WireMockServerTests.cs
+++ b/test/WireMock.Net.Tests/WireMockServerTests.cs
@@ -13,6 +13,7 @@
using WireMock.Admin.Mappings;
using WireMock.Matchers;
using WireMock.Net.Tests.Serialization;
+using WireMock.Net.Xunit;
using WireMock.RequestBuilders;
using WireMock.ResponseBuilders;
using WireMock.Server;
@@ -20,11 +21,19 @@
using WireMock.Types;
using WireMock.Util;
using Xunit;
+using Xunit.Abstractions;
namespace WireMock.Net.Tests
{
public partial class WireMockServerTests
{
+ private readonly ITestOutputHelper _testOutputHelper;
+
+ public WireMockServerTests(ITestOutputHelper testOutputHelper)
+ {
+ _testOutputHelper = testOutputHelper;
+ }
+
[Fact]
public async Task WireMockServer_Should_reset_requestlogs()
{
@@ -72,7 +81,10 @@ public async Task WireMockServer_Should_respond_a_redirect_without_body()
string path = $"/foo_{Guid.NewGuid()}";
string pathToRedirect = $"/bar_{Guid.NewGuid()}";
- var server = WireMockServer.Start();
+ var server = WireMockServer.Start(new WireMockServerSettings
+ {
+ Logger = new TestOutputHelperWireMockLogger(_testOutputHelper)
+ });
server
.Given(Request.Create()