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()