From 92f64f13aa10fa0339eadd0a148f3e950e4911e0 Mon Sep 17 00:00:00 2001 From: Bouke Haarsma Date: Fri, 23 Feb 2024 14:33:06 +0100 Subject: [PATCH] Opt-out of Moq's Verify() / Setup() in IDISP013 --- .../IDISP013AwaitInUsingTests/Valid.Ignore.cs | 29 +++++++++++++++++++ .../Analyzers/ReturnValueAnalyzer.cs | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/IDisposableAnalyzers.Test/IDISP013AwaitInUsingTests/Valid.Ignore.cs b/IDisposableAnalyzers.Test/IDISP013AwaitInUsingTests/Valid.Ignore.cs index 3320a952..37c430e5 100644 --- a/IDisposableAnalyzers.Test/IDISP013AwaitInUsingTests/Valid.Ignore.cs +++ b/IDisposableAnalyzers.Test/IDISP013AwaitInUsingTests/Valid.Ignore.cs @@ -32,5 +32,34 @@ public void M() """; RoslynAssert.Valid(Analyzer, code); } + + [Test] + public static void MoqSetupVerifyAsync() + { + var code = @" +namespace N +{ + using System; + using System.IO; + using System.Threading; + using Moq; + + public class C + { + public void M() + { + using (var stream = File.OpenRead(string.Empty)) + { + var mock = new Mock(); + mock.Setup(x => x.ReadAsync(It.IsAny>(), It.IsAny())) + .ReturnsAsync(0); + mock.Verify(x => x.ReadAsync(It.IsAny>(), It.IsAny())); + } + } + } +}"; + + RoslynAssert.Valid(Analyzer, code); + } } } diff --git a/IDisposableAnalyzers/Analyzers/ReturnValueAnalyzer.cs b/IDisposableAnalyzers/Analyzers/ReturnValueAnalyzer.cs index 1ce4fddd..c1607a08 100644 --- a/IDisposableAnalyzers/Analyzers/ReturnValueAnalyzer.cs +++ b/IDisposableAnalyzers/Analyzers/ReturnValueAnalyzer.cs @@ -136,7 +136,7 @@ static bool ShouldAwait(SyntaxNodeAnalysisContext context, ExpressionSyntax retu { if (returnValue.TryFirstAncestor(out InvocationExpressionSyntax? ancestor) && ancestor.TryGetMethodName(out var ancestorName) && - ancestorName == "ThrowsAsync") + ancestorName is "ThrowsAsync" or "Setup" or "Verify") { return false; }