From a4519011daf1332a79849aead998a8eb85d1ca53 Mon Sep 17 00:00:00 2001 From: stevenaw Date: Sun, 7 Dec 2025 14:20:32 -0500 Subject: [PATCH 1/2] Add cancel after snippets --- .../writing-tests/attributes/cancelafter.md | 13 ++----- .../CancelAfterAttributeExamples.cs | 38 +++++++++++++++++++ .../Snippets.NUnit/Snippets.NUnit.csproj | 2 +- 3 files changed, 43 insertions(+), 10 deletions(-) create mode 100644 docs/snippets/Snippets.NUnit/Attributes/CancelAfterAttributeExamples.cs diff --git a/docs/articles/nunit/writing-tests/attributes/cancelafter.md b/docs/articles/nunit/writing-tests/attributes/cancelafter.md index 279124870..d29c24386 100644 --- a/docs/articles/nunit/writing-tests/attributes/cancelafter.md +++ b/docs/articles/nunit/writing-tests/attributes/cancelafter.md @@ -37,16 +37,11 @@ When used on test methods, NUnit automatically adds an extra argument to your me ## Example -```csharp -[Test, CancelAfter(2000)] -public void RunningTestUntilCanceled(CancellationToken token) -{ - while (!token.IsCancellationRequested) - { - /* */ - } -} +[!code-csharp[TestWithCancellationToken](~/snippets/Snippets.NUnit/Attributes/CancelAfterAttributeExamples.cs#TestWithCancellationToken)] +[!code-csharp[TestCaseSourceWithCancellationToken](~/snippets/Snippets.NUnit/Attributes/CancelAfterAttributeExamples.cs#TestCaseSourceWithCancellationToken)] + +```csharp [CancelAfter(2000)] [TestCase("http://server1")] [TestCase("http://server2")] diff --git a/docs/snippets/Snippets.NUnit/Attributes/CancelAfterAttributeExamples.cs b/docs/snippets/Snippets.NUnit/Attributes/CancelAfterAttributeExamples.cs new file mode 100644 index 000000000..243c86beb --- /dev/null +++ b/docs/snippets/Snippets.NUnit/Attributes/CancelAfterAttributeExamples.cs @@ -0,0 +1,38 @@ +using NUnit.Framework; +#pragma warning disable NUnit1029 // Pending https://github.com/nunit/nunit.analyzers/issues/957 + +namespace Snippets.NUnit.Attributes +{ + public class CancelAfterAttributeExamples + { + #region TestWithCancellationToken + + [Test, CancelAfter(2_000)] + public void RunningTestUntilCanceled(CancellationToken cancellationToken) + { + while (!cancellationToken.IsCancellationRequested) + { + /* */ + } + } + + #endregion + + #region TestCaseSourceWithCancellationToken + + private static int[] _simpleValues = { 2, 4, 6, 8 }; + + [TestCaseSource(nameof(_simpleValues)), CancelAfter(1_000)] + public async Task TestCaseSourceWithCancellationToken(int a, CancellationToken cancellationToken) + { + Assert.That(cancellationToken, Is.Not.Default); + + while (!cancellationToken.IsCancellationRequested) + { + /* */ + } + } + + #endregion + } +} diff --git a/docs/snippets/Snippets.NUnit/Snippets.NUnit.csproj b/docs/snippets/Snippets.NUnit/Snippets.NUnit.csproj index c0a965b60..33e29ff5c 100644 --- a/docs/snippets/Snippets.NUnit/Snippets.NUnit.csproj +++ b/docs/snippets/Snippets.NUnit/Snippets.NUnit.csproj @@ -10,7 +10,7 @@ - + all From ecd963b78bb015f62c0117f28b1ebe60d21dcabc Mon Sep 17 00:00:00 2001 From: stevenaw Date: Sun, 7 Dec 2025 14:51:13 -0500 Subject: [PATCH 2/2] Adjust some formatting for cancelafter attribute --- .../nunit/writing-tests/attributes/cancelafter.md | 10 +++++++++- .../Attributes/CancelAfterAttributeExamples.cs | 6 +----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/articles/nunit/writing-tests/attributes/cancelafter.md b/docs/articles/nunit/writing-tests/attributes/cancelafter.md index d29c24386..88fa81aa8 100644 --- a/docs/articles/nunit/writing-tests/attributes/cancelafter.md +++ b/docs/articles/nunit/writing-tests/attributes/cancelafter.md @@ -37,9 +37,13 @@ When used on test methods, NUnit automatically adds an extra argument to your me ## Example +The `CancelAfterAttribute` supports cancellation across a variety of ways to write tests. + +A simple test, written using the `Test` attribute: + [!code-csharp[TestWithCancellationToken](~/snippets/Snippets.NUnit/Attributes/CancelAfterAttributeExamples.cs#TestWithCancellationToken)] -[!code-csharp[TestCaseSourceWithCancellationToken](~/snippets/Snippets.NUnit/Attributes/CancelAfterAttributeExamples.cs#TestCaseSourceWithCancellationToken)] +A parameterized test written using the `TestCase` attribute: ```csharp [CancelAfter(2000)] @@ -55,6 +59,10 @@ public async Task PotentiallyLongRunningTest(string uri, CancellationToken token } ``` +A parameterized test written using the `TestCaseSource` attribute: + +[!code-csharp[TestCaseSourceWithCancellationToken](~/snippets/Snippets.NUnit/Attributes/CancelAfterAttributeExamples.cs#TestCaseSourceWithCancellationToken)] + > [!NOTE] > When debugging a unit test, i.e. when a debugger is attached to the process, the timeout is not enforced. diff --git a/docs/snippets/Snippets.NUnit/Attributes/CancelAfterAttributeExamples.cs b/docs/snippets/Snippets.NUnit/Attributes/CancelAfterAttributeExamples.cs index 243c86beb..06b7472ce 100644 --- a/docs/snippets/Snippets.NUnit/Attributes/CancelAfterAttributeExamples.cs +++ b/docs/snippets/Snippets.NUnit/Attributes/CancelAfterAttributeExamples.cs @@ -6,7 +6,6 @@ namespace Snippets.NUnit.Attributes public class CancelAfterAttributeExamples { #region TestWithCancellationToken - [Test, CancelAfter(2_000)] public void RunningTestUntilCanceled(CancellationToken cancellationToken) { @@ -15,15 +14,13 @@ public void RunningTestUntilCanceled(CancellationToken cancellationToken) /* */ } } - #endregion #region TestCaseSourceWithCancellationToken - private static int[] _simpleValues = { 2, 4, 6, 8 }; [TestCaseSource(nameof(_simpleValues)), CancelAfter(1_000)] - public async Task TestCaseSourceWithCancellationToken(int a, CancellationToken cancellationToken) + public void TestCaseSourceWithCancellationToken(int a, CancellationToken cancellationToken) { Assert.That(cancellationToken, Is.Not.Default); @@ -32,7 +29,6 @@ public async Task TestCaseSourceWithCancellationToken(int a, CancellationToken c /* */ } } - #endregion } }