Skip to content

Commit 573ec3c

Browse files
Ony Unwrap TargetInvocationException if raised from inside NUnit.Framework
1 parent 596f761 commit 573ec3c

File tree

3 files changed

+53
-1
lines changed

3 files changed

+53
-1
lines changed

src/NUnitFramework/framework/Internal/ExceptionHelper.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,8 @@ public static Exception Unwrap(this Exception exception)
225225
}
226226

227227
while (exception is TargetInvocationException targetInvocationException &&
228-
targetInvocationException.InnerException is not null)
228+
targetInvocationException.InnerException is not null &&
229+
targetInvocationException.StackTrace?.Contains("NUnit.Framework") is true)
229230
{
230231
exception = targetInvocationException.InnerException;
231232
}

src/NUnitFramework/testdata/UnexpectedExceptionFixture.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@ namespace NUnit.TestData.UnexpectedExceptionFixture
88
[TestFixture]
99
public class UnexpectedExceptionFixture
1010
{
11+
[Test]
12+
public void ThrowsException()
13+
{
14+
throw new Exception("Thrown Exception");
15+
}
16+
1117
[Test]
1218
public void ThrowsWithInnerException()
1319
{
@@ -50,6 +56,12 @@ public void ThrowsCustomException()
5056
throw new CustomException("message", new CustomType());
5157
}
5258

59+
[Test]
60+
public void ThrowsTargetInvocationException()
61+
{
62+
GetType().GetMethod(nameof(ThrowsException))!.Invoke(this, null);
63+
}
64+
5365
[Test]
5466
public void AssertThatWithRecursivelyThrowingExceptionAsActual()
5567
{

src/NUnitFramework/tests/Internal/UnexpectedExceptionTests.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,22 @@ private static ITestResult RunDataTestCase(string methodName)
1616
return TestBuilder.RunTestCase(typeof(UnexpectedExceptionFixture), methodName);
1717
}
1818

19+
[Test]
20+
public void FailRecordsException()
21+
{
22+
string expectedMessage =
23+
"System.Exception : Thrown Exception";
24+
25+
ITestResult result = RunDataTestCase(nameof(UnexpectedExceptionFixture.ThrowsException));
26+
27+
Assert.Multiple(() =>
28+
{
29+
Assert.That(result.ResultState, Is.EqualTo(ResultState.Error));
30+
Assert.That(result.Message, Is.EqualTo(expectedMessage));
31+
Assert.That(result.StackTrace, Does.Contain(nameof(UnexpectedExceptionFixture.ThrowsException)));
32+
});
33+
}
34+
1935
[Test]
2036
public void FailRecordsInnerException()
2137
{
@@ -28,6 +44,7 @@ public void FailRecordsInnerException()
2844
{
2945
Assert.That(result.ResultState, Is.EqualTo(ResultState.Error));
3046
Assert.That(result.Message, Is.EqualTo(expectedMessage));
47+
Assert.That(result.StackTrace, Does.Contain(nameof(UnexpectedExceptionFixture.ThrowsWithInnerException)));
3148
});
3249
}
3350

@@ -45,6 +62,7 @@ public void FailRecordsNestedInnerException()
4562
{
4663
Assert.That(result.ResultState, Is.EqualTo(ResultState.Error));
4764
Assert.That(result.Message, Is.EqualTo(expectedMessage));
65+
Assert.That(result.StackTrace, Does.Contain(nameof(UnexpectedExceptionFixture.ThrowsWithNestedInnerException)));
4866
});
4967
}
5068

@@ -63,6 +81,7 @@ public void FailRecordsInnerExceptionsAsPartOfAggregateException()
6381
Assert.That(result.ResultState, Is.EqualTo(ResultState.Error));
6482
Assert.That(result.Message, Does.StartWith(expectedStartOfMessage));
6583
Assert.That(result.Message, Does.EndWith(expectedEndOfMessage));
84+
Assert.That(result.StackTrace, Does.Contain(nameof(UnexpectedExceptionFixture.ThrowsWithAggregateException)));
6685
});
6786
}
6887

@@ -81,6 +100,7 @@ public void FailRecordsNestedInnerExceptionAsPartOfAggregateException()
81100
Assert.That(result.ResultState, Is.EqualTo(ResultState.Error));
82101
Assert.That(result.Message, Does.StartWith(expectedStartOfMessage));
83102
Assert.That(result.Message, Does.EndWith(expectedEndOfMessage));
103+
Assert.That(result.StackTrace, Does.Contain(nameof(UnexpectedExceptionFixture.ThrowsWithAggregateExceptionContainingNestedInnerException)));
84104
});
85105
}
86106

@@ -106,6 +126,25 @@ public void CustomExceptionIsHandled()
106126
{
107127
Assert.That(result.ResultState, Is.EqualTo(ResultState.Error));
108128
Assert.That(result.Message, Is.EqualTo("NUnit.TestData.UnexpectedExceptionFixture.CustomException : message"));
129+
Assert.That(result.StackTrace, Does.Contain(nameof(UnexpectedExceptionFixture.ThrowsCustomException)));
130+
});
131+
}
132+
133+
[Test]
134+
public void TargetInvocationExceptionInUserCodeIsPassedThrough()
135+
{
136+
string expectedStartOfMessage = "System.Reflection.TargetInvocationException";
137+
string expectedEndOfMessage = " ----> System.Exception : Thrown Exception";
138+
139+
ITestResult result = RunDataTestCase(nameof(UnexpectedExceptionFixture.ThrowsTargetInvocationException));
140+
141+
Assert.Multiple(() =>
142+
{
143+
Assert.That(result.ResultState, Is.EqualTo(ResultState.Error));
144+
Assert.That(result.Message, Does.StartWith(expectedStartOfMessage));
145+
Assert.That(result.Message, Does.EndWith(expectedEndOfMessage));
146+
Assert.That(result.StackTrace, Does.Contain(nameof(UnexpectedExceptionFixture.ThrowsTargetInvocationException)));
147+
Assert.That(result.StackTrace, Does.Contain(nameof(UnexpectedExceptionFixture.ThrowsException)));
109148
});
110149
}
111150

0 commit comments

Comments
 (0)