diff --git a/src/Polly/NoOp/AsyncNoOpPolicy.cs b/src/Polly/NoOp/AsyncNoOpPolicy.cs
index 0eb7eef5e3c..277dad9640e 100644
--- a/src/Polly/NoOp/AsyncNoOpPolicy.cs
+++ b/src/Polly/NoOp/AsyncNoOpPolicy.cs
@@ -4,7 +4,6 @@ namespace Polly.NoOp;
///
/// A noop policy that can be applied to asynchronous delegates.
///
-#pragma warning disable CA1062 // Validate arguments of public methods
public class AsyncNoOpPolicy : AsyncPolicy, INoOpPolicy
{
internal AsyncNoOpPolicy()
@@ -14,8 +13,15 @@ internal AsyncNoOpPolicy()
///
[DebuggerStepThrough]
protected override Task ImplementationAsync(Func> action, Context context, CancellationToken cancellationToken,
- bool continueOnCapturedContext) =>
- NoOpEngine.ImplementationAsync(action, context, cancellationToken);
+ bool continueOnCapturedContext)
+ {
+ if (action is null)
+ {
+ throw new ArgumentNullException(nameof(action));
+ }
+
+ return NoOpEngine.ImplementationAsync(action, context, cancellationToken);
+ }
}
///
@@ -31,6 +37,13 @@ internal AsyncNoOpPolicy()
///
[DebuggerStepThrough]
protected override Task ImplementationAsync(Func> action, Context context, CancellationToken cancellationToken,
- bool continueOnCapturedContext) =>
- NoOpEngine.ImplementationAsync(action, context, cancellationToken);
+ bool continueOnCapturedContext)
+ {
+ if (action is null)
+ {
+ throw new ArgumentNullException(nameof(action));
+ }
+
+ return NoOpEngine.ImplementationAsync(action, context, cancellationToken);
+ }
}
diff --git a/test/Polly.Specs/NoOp/NoOpAsyncSpecs.cs b/test/Polly.Specs/NoOp/NoOpAsyncSpecs.cs
index c94cf069ea0..b89b21bb1fe 100644
--- a/test/Polly.Specs/NoOp/NoOpAsyncSpecs.cs
+++ b/test/Polly.Specs/NoOp/NoOpAsyncSpecs.cs
@@ -2,6 +2,25 @@
public class NoOpAsyncSpecs
{
+ [Fact]
+ public void Should_throw_when_action_is_null()
+ {
+ var flags = BindingFlags.NonPublic | BindingFlags.Instance;
+ Func> action = null!;
+
+ var instance = Activator.CreateInstance(typeof(AsyncNoOpPolicy), true)!;
+ var instanceType = instance.GetType();
+ var methods = instanceType.GetMethods(flags);
+ var methodInfo = methods.First(method => method is { Name: "ImplementationAsync", ReturnType.Name: "Task`1" });
+ var generic = methodInfo.MakeGenericMethod(typeof(EmptyStruct));
+
+ var func = () => generic.Invoke(instance, [action, new Context(), CancellationToken.None, false]);
+
+ var exceptionAssertions = func.Should().Throw();
+ exceptionAssertions.And.Message.Should().Be("Exception has been thrown by the target of an invocation.");
+ exceptionAssertions.WithInnerException("action");
+ }
+
[Fact]
public async Task Should_execute_user_delegate()
{
diff --git a/test/Polly.Specs/NoOp/NoOpTResultAsyncSpecs.cs b/test/Polly.Specs/NoOp/NoOpTResultAsyncSpecs.cs
index b8f9b3b18bc..03e24cf3c16 100644
--- a/test/Polly.Specs/NoOp/NoOpTResultAsyncSpecs.cs
+++ b/test/Polly.Specs/NoOp/NoOpTResultAsyncSpecs.cs
@@ -2,6 +2,24 @@
public class NoOpTResultAsyncSpecs
{
+ [Fact]
+ public void Should_throw_when_action_is_null()
+ {
+ var flags = BindingFlags.NonPublic | BindingFlags.Instance;
+ Func> action = null!;
+
+ var instance = Activator.CreateInstance(typeof(AsyncNoOpPolicy), true)!;
+ var instanceType = instance.GetType();
+ var methods = instanceType.GetMethods(flags);
+ var methodInfo = methods.First(method => method is { Name: "ImplementationAsync", ReturnType.Name: "Task`1" });
+
+ var func = () => methodInfo.Invoke(instance, [action, new Context(), CancellationToken.None, false]);
+
+ var exceptionAssertions = func.Should().Throw();
+ exceptionAssertions.And.Message.Should().Be("Exception has been thrown by the target of an invocation.");
+ exceptionAssertions.WithInnerException("action");
+ }
+
[Fact]
public async Task Should_execute_user_delegate()
{