2016-05-31 6 views
3

テストの書き込み中に奇妙なVisual Studio静的解析エラーが発生しました。コードは両方のテスト方法FailCAPassCAの両方にCA1811を生成します。静的解析ラムダ式を使用したテストメソッドのCA1811エラー

'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)); 
     } 
    } 

私はその後両方方法のため。消える警告この

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

のようなものへのFailCAまたは変更のコードをコメントした場合。だから、() => MethodToTest (null)にはこれと関係があります。

すべての方法で警告が生成される理由はありますか?

+0

あなたのクラスは内部クラスなので、パブリック関数はアセンブリ内からのみ呼び出すことができますが、これはどこでも行われないため、デッドコードとみなされます。 – Aconcagua

+0

@Aconcagua CA1811の意味は分かっています。私の質問は、私が 'FailCA'メソッドを持っているときにだけ生成される理由です。そのメソッドをコメントアウトすると、警告は生成されません。 –

+0

コメントアウトすると、デッドコードがないので、警告は表示されません。興味深い部分は非静的にしています:静的メソッドは、どのクラスインスタンスからも独立しています(したがって、暗黙のthisはありません)。このような静的メソッドは、外部からアクセスできない場合はアセンブリ内のどこかで呼び出されることが期待されます。非静的メソッドは、オブジェクトの存在に結びついています。明らかに、そのようなインスタンスが作成されたかどうかはチェックされていないため、デッドコードの場合は決定もできないため、警告は表示されません。 – Aconcagua

答えて

1

Iすべてのルールを有効にしたセットアップコード分析。おそらく、フレームワークによって動的に呼び出されているため、ほとんどのNUnitテストフィクスチャに表示されるため、CA1812が抑制されている可能性があります。いずれにしても:

コードでは、質問に記載されている2つの警告が表示されます。私がFailCAをコメントアウトするか、静的にしないと、私はそれらの警告を取得しません。しかし、別の警告が表示されます。

警告CA1812 'ClassToTestTests'は明らかにインスタンス化されない内部クラスです。その場合は、アセンブリからコードを削除します。このクラスに静的メソッドのみを含める場合は、プライベートコンストラクタを追加して、コンパイラがデフォルトのコンストラクタを生成しないようにすることを検討してください。

コードアナライザは、クラス全体がインスタンス化されず、静的メソッドを持たないと判断したので、クラス内の各メソッドが呼び出されたかどうかを確認する必要はありません。 。

FailCAのコメントを外すと、静的メソッドがあるということは、クラスがインスタンス化されていないことがわかっていても、呼び出し元のメソッドをチェックする必要があることを意味します。

+0

私は実際にCA1812を無効にしていた縫い目(なぜ起こったのか分かりません)。それから、実際には意味があります。 –

関連する問題