From 2e4f08bac10047bd7052ceba846c620904477e10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Jare=C5=A1?= Date: Wed, 26 Nov 2025 11:23:47 +0100 Subject: [PATCH] Report the actual exception from assertion --- .../Assertions/Assert.ThrowsException.cs | 6 ++++-- .../TestFramework/Resources/FrameworkMessages.resx | 2 +- .../Resources/xlf/FrameworkMessages.cs.xlf | 4 ++-- .../Resources/xlf/FrameworkMessages.de.xlf | 4 ++-- .../Resources/xlf/FrameworkMessages.es.xlf | 4 ++-- .../Resources/xlf/FrameworkMessages.fr.xlf | 4 ++-- .../Resources/xlf/FrameworkMessages.it.xlf | 4 ++-- .../Resources/xlf/FrameworkMessages.ja.xlf | 4 ++-- .../Resources/xlf/FrameworkMessages.ko.xlf | 4 ++-- .../Resources/xlf/FrameworkMessages.pl.xlf | 4 ++-- .../Resources/xlf/FrameworkMessages.pt-BR.xlf | 4 ++-- .../Resources/xlf/FrameworkMessages.ru.xlf | 4 ++-- .../Resources/xlf/FrameworkMessages.tr.xlf | 4 ++-- .../Resources/xlf/FrameworkMessages.zh-Hans.xlf | 4 ++-- .../Resources/xlf/FrameworkMessages.zh-Hant.xlf | 4 ++-- .../Assertions/AssertTests.ThrowsExceptionTests.cs | 12 ++++++------ 16 files changed, 37 insertions(+), 35 deletions(-) diff --git a/src/TestFramework/TestFramework/Assertions/Assert.ThrowsException.cs b/src/TestFramework/TestFramework/Assertions/Assert.ThrowsException.cs index 65b7389ab4..f7bab1f11d 100644 --- a/src/TestFramework/TestFramework/Assertions/Assert.ThrowsException.cs +++ b/src/TestFramework/TestFramework/Assertions/Assert.ThrowsException.cs @@ -537,7 +537,8 @@ private static async Task IsThrowsAsyncFailingAsync(Action action, b FrameworkMessages.WrongExceptionThrown, userMessage, typeof(TException), - ex.GetType()); + ex.GetType(), + ex.ToString()); ThrowAssertFailed("Assert." + assertMethodName, finalMessage); }, ex); } diff --git a/src/TestFramework/TestFramework/Resources/FrameworkMessages.resx b/src/TestFramework/TestFramework/Resources/FrameworkMessages.resx index 6c020b112d..ea431eb468 100644 --- a/src/TestFramework/TestFramework/Resources/FrameworkMessages.resx +++ b/src/TestFramework/TestFramework/Resources/FrameworkMessages.resx @@ -254,7 +254,7 @@ Actual: {2} Expected exception type:<{1}> but no exception was thrown. {0} - Expected exception type:<{1}>. Actual exception type:<{2}>. {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} {0} ({1}) diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.cs.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.cs.xlf index 03e9f41d37..0603a7d7ab 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.cs.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.cs.xlf @@ -359,8 +359,8 @@ Skutečnost: {2} - Expected exception type:<{1}>. Actual exception type:<{2}>. {0} - Očekávaný typ výjimky: <{1}> Skutečný typ výjimky: <{2}>. {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.de.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.de.xlf index 20e678abce..7f20cdbe46 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.de.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.de.xlf @@ -359,8 +359,8 @@ Tatsächlich: {2} - Expected exception type:<{1}>. Actual exception type:<{2}>. {0} - Erwarteter Ausnahmetyp:<{1}>. Tatsächlicher Ausnahmetyp:<{2}>. {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.es.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.es.xlf index 714898f67a..0711b2894d 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.es.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.es.xlf @@ -359,8 +359,8 @@ Real: {2} - Expected exception type:<{1}>. Actual exception type:<{2}>. {0} - Tipo de excepción esperada:<{1}>. Tipo de excepción actual: <{2}>. {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.fr.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.fr.xlf index 1034b8d677..9996cad36d 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.fr.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.fr.xlf @@ -359,8 +359,8 @@ Réel : {2} - Expected exception type:<{1}>. Actual exception type:<{2}>. {0} - Type d’exception attendu :<{1}>. Type d’exception réel :<{2}>. {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.it.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.it.xlf index e7d9192682..4287432510 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.it.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.it.xlf @@ -359,8 +359,8 @@ Effettivo: {2} - Expected exception type:<{1}>. Actual exception type:<{2}>. {0} - Tipo di eccezione previsto:<{1}>. Tipo di eccezione effettivo: <{2}>. {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ja.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ja.xlf index ae85c73042..52866eeac5 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ja.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ja.xlf @@ -359,8 +359,8 @@ Actual: {2} - Expected exception type:<{1}>. Actual exception type:<{2}>. {0} - 予期される例外の種類: <{1}>。実際の例外の種類: <{2}>。{0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ko.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ko.xlf index 9b6251792d..aaab94a780 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ko.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ko.xlf @@ -359,8 +359,8 @@ Actual: {2} - Expected exception type:<{1}>. Actual exception type:<{2}>. {0} - 예상 예외 형식:<{1}>. 실제 예상 형식:<{2}>. {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.pl.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.pl.xlf index 0ead3025d0..75606cd748 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.pl.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.pl.xlf @@ -359,8 +359,8 @@ Rzeczywiste: {2} - Expected exception type:<{1}>. Actual exception type:<{2}>. {0} - Oczekiwano typu wyjątku:<{1}>. Rzeczywisty typ wyjątku:<{2}>. {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.pt-BR.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.pt-BR.xlf index 49553f8576..7b10516467 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.pt-BR.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.pt-BR.xlf @@ -359,8 +359,8 @@ Real: {2} - Expected exception type:<{1}>. Actual exception type:<{2}>. {0} - Tipo de exceção esperado:<{1}>. Tipo de exceção real:<{2}>. {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ru.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ru.xlf index c5f33d5adb..d2f5a06f6d 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ru.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ru.xlf @@ -359,8 +359,8 @@ Actual: {2} - Expected exception type:<{1}>. Actual exception type:<{2}>. {0} - Ожидаемый тип исключения:<{1}>. Фактический тип исключения:<{2}>. {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.tr.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.tr.xlf index ffbb9afce9..947d8e807e 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.tr.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.tr.xlf @@ -359,8 +359,8 @@ Gerçekte olan: {2} - Expected exception type:<{1}>. Actual exception type:<{2}>. {0} - Beklenen özel durum türü:<{1}>. Gerçek özel durum türü:<{2}>. {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.zh-Hans.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.zh-Hans.xlf index 2b2836c6db..61d78a6541 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.zh-Hans.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.zh-Hans.xlf @@ -359,8 +359,8 @@ Actual: {2} - Expected exception type:<{1}>. Actual exception type:<{2}>. {0} - 预期异常类型:<{1}>。实际异常类型:<{2}>。{0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.zh-Hant.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.zh-Hant.xlf index 0a4453ac7d..e737b86933 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.zh-Hant.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.zh-Hant.xlf @@ -359,8 +359,8 @@ Actual: {2} - Expected exception type:<{1}>. Actual exception type:<{2}>. {0} - 預期的例外狀況類型:<{1}>。實際的例外狀況類型:<{2}>。{0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} + Expected exception type:<{1}>. Actual exception type:<{2}>. Actual exception: {3} {0} diff --git a/test/UnitTests/TestFramework.UnitTests/Assertions/AssertTests.ThrowsExceptionTests.cs b/test/UnitTests/TestFramework.UnitTests/Assertions/AssertTests.ThrowsExceptionTests.cs index c41eba3302..14b60eec16 100644 --- a/test/UnitTests/TestFramework.UnitTests/Assertions/AssertTests.ThrowsExceptionTests.cs +++ b/test/UnitTests/TestFramework.UnitTests/Assertions/AssertTests.ThrowsExceptionTests.cs @@ -70,7 +70,7 @@ public void ThrowsAsync_WhenExceptionIsNotExpectedType_ShouldThrow() Action action = t.Wait; action.Should().Throw() .WithInnerException() - .WithMessage("Assert.ThrowsAsync failed. Expected exception type:. Actual exception type:. 'action' expression: '() => throw new Exception()'."); + .WithMessage("Assert.ThrowsAsync failed. Expected exception type:. Actual exception type:. Actual exception: System.Exception: Exception of type 'System.Exception' was thrown.*'action' expression: '() => throw new Exception()'."); } public void ThrowsExactlyAsync_WhenExceptionIsDerivedFromExpectedType_ShouldThrow() @@ -79,7 +79,7 @@ public void ThrowsExactlyAsync_WhenExceptionIsDerivedFromExpectedType_ShouldThro Action action = t.Wait; action.Should().Throw() .WithInnerException() - .WithMessage("Assert.ThrowsExactlyAsync failed. Expected exception type:. Actual exception type:. 'action' expression: '() => throw new ArgumentNullException()'."); + .WithMessage("Assert.ThrowsExactlyAsync failed. Expected exception type:. Actual exception type:. Actual exception: System.ArgumentNullException: Value cannot be null.*'action' expression: '() => throw new ArgumentNullException()'."); } public void Throws_WithMessageBuilder_Passes() @@ -122,7 +122,7 @@ public void Throws_WithMessageBuilder_FailsBecauseTypeMismatch() return "message constructed via builder."; }); action.Should().Throw() - .WithMessage("Assert.Throws failed. Expected exception type:. Actual exception type:. 'action' expression: '() => throw new ArgumentOutOfRangeException(\"MyParamNameHere\")'. message constructed via builder."); + .WithMessage("Assert.Throws failed. Expected exception type:. Actual exception type:. Actual exception: System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.*'action' expression: '() => throw new ArgumentOutOfRangeException(\"MyParamNameHere\")'. message constructed via builder."); wasBuilderCalled.Should().BeTrue(); exceptionPassedToBuilder.Should().BeOfType(); @@ -169,7 +169,7 @@ public void ThrowsExactly_WithMessageBuilder_FailsBecauseTypeMismatch() return "message constructed via builder."; }); action.Should().Throw() - .WithMessage("Assert.ThrowsExactly failed. Expected exception type:. Actual exception type:. 'action' expression: '() => throw new ArgumentOutOfRangeException(\"MyParamNameHere\")'. message constructed via builder."); + .WithMessage("Assert.ThrowsExactly failed. Expected exception type:. Actual exception type:. Actual exception: System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.*'action' expression: '() => throw new ArgumentOutOfRangeException(\"MyParamNameHere\")'. message constructed via builder."); wasBuilderCalled.Should().BeTrue(); exceptionPassedToBuilder.Should().BeOfType(); @@ -216,7 +216,7 @@ public async Task ThrowsAsync_WithMessageBuilder_FailsBecauseTypeMismatch() return "message constructed via builder."; }); (await action.Should().ThrowAsync()) - .WithMessage("Assert.ThrowsAsync failed. Expected exception type:. Actual exception type:. 'action' expression: '() => Task.FromException(new ArgumentOutOfRangeException(\"MyParamNameHere\"))'. message constructed via builder."); + .WithMessage("Assert.ThrowsAsync failed. Expected exception type:. Actual exception type:. Actual exception: System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.*'action' expression: '() => Task.FromException(new ArgumentOutOfRangeException(\"MyParamNameHere\"))'. message constructed via builder."); wasBuilderCalled.Should().BeTrue(); exceptionPassedToBuilder.Should().BeOfType(); @@ -263,7 +263,7 @@ public async Task ThrowsExactlyAsync_WithMessageBuilder_FailsBecauseTypeMismatch return "message constructed via builder."; }); (await action.Should().ThrowAsync()) - .WithMessage("Assert.ThrowsExactlyAsync failed. Expected exception type:. Actual exception type:. 'action' expression: '() => Task.FromException(new ArgumentOutOfRangeException(\"MyParamNameHere\"))'. message constructed via builder."); + .WithMessage("Assert.ThrowsExactlyAsync failed. Expected exception type:. Actual exception type:. Actual exception: System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.*'action' expression: '() => Task.FromException(new ArgumentOutOfRangeException(\"MyParamNameHere\"))'. message constructed via builder."); wasBuilderCalled.Should().BeTrue(); exceptionPassedToBuilder.Should().BeOfType();