2016-05-31 7 views
3

Beim Schreiben meines Tests habe ich einen statischen Visual Studio-Analysefehler festgestellt. Der folgende Code generiert CA1811 für beide Testmethoden FailCA und PassCA.Statische Analyse CA1811-Fehler bei Testmethoden mit Lambda-Ausdrücken

'ClassToTestTests.FailCA()' scheint keine Upstream-öffentlichen oder geschützten Anrufer zu haben. 'ClassToTestTests.PassCA()' scheint keine Upstream-öffentlichen oder geschützten Anrufer zu haben.

Code:

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

Wenn ich Kommentar FailCA oder Änderungscode davon so etwas wie dieses

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

Dann verschwindet für beiden Methoden warnen. Es scheint also, dass () => MethodToTest (null) etwas damit zu tun hat.

Irgendwelche Ideen, warum Warnungen für alle Methoden generiert werden?

+0

Ihre Klasse ist intern, so dass die öffentlichen Funktionen nur innerhalb der Baugruppe aufgerufen werden können - aber dies wird nirgendwo gemacht, daher wird es als toter Code betrachtet - also die Warnung. – Aconcagua

+0

@Aconcagua Ich weiß, was CA1811 bedeutet. Meine Frage ist, warum es nur generiert wird, wenn ich 'FailCA' Methode habe. Warnung wird nicht generiert, wenn ich diese Methode auszeichne. –

+0

Wenn Sie es auskommentieren, gibt es keinen toten Code, also keine Warnung. Interessanter Teil macht es nicht statisch: Eine statische Methode ist unabhängig von Klasseninstanzen (und hat somit keine implizite Bedeutung). Es wird erwartet, dass eine solche statische Methode irgendwo innerhalb der Baugruppe aufgerufen wird, wenn sie nicht von außen zugänglich ist. Nicht-statische Methoden sind an die Existenz eines Objekts gebunden. Offensichtlich gibt es keine Überprüfung, ob solch eine Instanz jemals erzeugt wird, so dass eine Entscheidung, ob ein toter Code, auch nicht gemacht werden kann, also keine Warnung. – Aconcagua

Antwort

1

Ich Setup-Code-Analyse mit allen Regeln aktiviert. Vielleicht haben Sie CA1812 unterdrückt, weil es auf den meisten NUnit-Testgeräten erscheinen würde, da sie dynamisch vom Framework aufgerufen werden. So oder so:

Mit Ihrem Code erhalte ich die 2 Warnungen, die Sie in Ihrer Frage aufgelistet haben. Wenn ich FailCA auskommentiere oder es nicht-statisch mache, bekomme ich diese Warnungen nicht. Allerdings bekomme ich stattdessen eine andere Warnung:

Warnung CA1812 'ClassToTestTests' ist eine interne Klasse, die anscheinend nie instanziiert wird. Wenn dies der Fall ist, entfernen Sie den Code aus der Assembly. Wenn diese Klasse nur statische Methoden enthalten soll, sollten Sie einen privaten Konstruktor hinzufügen, um zu verhindern, dass der Compiler einen Standardkonstruktor generiert.

Also, der Grund, Ihre ursprüngliche Warnung verschwindet, weil der Code Analyzer bereits, dass die ganze Klasse bestimmt hat, wird nie instanziiert und hat keine statischen Methoden so ist es nicht, wenn jede Methode innerhalb der Klasse zu überprüfen, muss die Mühe wird aufgerufen .

Wenn Sie FailCA auskommentieren, bedeutet die Tatsache, dass eine statische Methode vorhanden ist, dass die Methoden für Anrufer überprüft werden müssen, obwohl sie weiß, dass die Klasse niemals instanziert ist.

+0

Es scheint, dass ich CA1812 deaktiviert hatte (weiß nicht, warum das passiert ist). Dann macht das tatsächlich Sinn. –