簡體   English   中英

使用lambda表達式的測試方法的靜態分析CA1811錯誤

[英]Static analysis CA1811 error on Test methods with lambda expressions

我在編寫測試時發現了一個奇怪的Visual Studio靜態分析錯誤。 該代碼產生波紋管CA1811上測試方法既FailCAPassCA

'ClassToTestTests.FailCA()'似乎沒有上游公共或受保護的呼叫者。 'ClassToTestTests.PassCA()'似乎沒有上游公共或受保護的呼叫者。

碼:

using System;
using NUnit.Framework;
using static Namespace.ClassToTest;
using static NUnit.Framework.Assert;

namespace Namespace {
    public static class ClassToTest {
        public static object MethodToTest (object value) => value;
        }

    [TestFixture]
    internal sealed class ClassToTestTests {
        private object value = new object ();

        [Test]
        public static void FailCA () => Throws<ArgumentNullException> (() => MethodToTest (null));

        [Test]
        public void PassCA () => Throws<ArgumentNullException> (() => MethodToTest (value));
        }
    }

如果我評論FailCA或將其代碼改為這樣的話

[Test]
public void FailCA () {
    value = null;
    Throws<ArgumentNullException> (() => MethodToTest (value));
}

然后警告兩種方法的消失。 所以它接縫() => MethodToTest (null)與此有關。

是否有為所有方法生成警告的想法?

我設置了啟用所有規則的代碼分析。 也許你有CA1812被抑制,因為它會出現在大多數NUnit測試裝置上,因為它們是由框架動態調用的。 無論哪種方式:

使用您的代碼,我會收到您在問題中列出的2個警告。 當我評論出FailCA或使其成為非靜態時,我就不會收到這些警告。 但是我確實得到另一個警告:

警告CA1812'ClassToTestTests'是一個顯然從未實例化的內部類。 如果是這樣,請從程序集中刪除代碼。 如果此類僅包含靜態方法,請考慮添加私有構造函數以防止編譯器生成默認構造函數。

因此,原始警告消失的原因是代碼分析器已經確定整個類從未實例化並且沒有靜態方法,因此無需檢查是否已調用類中的每個方法。

當您取消注釋FailCA時,存在靜態方法的事實意味着它需要檢查調用方的方法,即使它知道該類從未實例化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM