MSTEST0081: "[TestFilterProvider]" sollte auf einen gültigen Testfiltertyp verweisen.

Eigenschaft Wert
Regel-ID MSTEST0081
Title '[TestFilterProvider]' sollte auf einen gültigen Testfiltertyp verweisen
Kategorie Usage
Die Behebung ist eingreifend oder nicht eingreifend Non-breaking
Standardmäßig aktiviert Ja
Voreingestellte Schwere Warning
wurde in Version eingeführt. 4.4.0 (Vorschau)
Gibt es eine Codekorrektur No

Important

Dieser Analyzer ist für MSTest 4.4 geplant und ist nur in Vorschaubuilds verfügbar, bis MSTest 4.4.0 veröffentlicht wird.

Ursache

[assembly: TestFilterProvider(typeof(MyFilter))] verweist auf einen Typ, der die Anforderungen nicht erfüllt, die der Adapter zur Laufzeit erzwingt, oder die Assembly registriert mehrere Testfilteranbieter.

Regelbeschreibung

[assembly: TestFilterProvider(typeof(MyFilter))] übergibt den Filtertyp als A Type, sodass der Compiler überhaupt einen beliebigen Typ akzeptiert. Der Adapter überprüft den Typ nur, wenn er den Filter materialisiert, und dann schlägt die gesamte Ausführung fehl. Dieser Analyzer meldet die gleichen Probleme zur Erstellungszeit, wo sie billig zu beheben sind. Auf den referenzierten Typ muss Folgendes zu beachten sein:

  • Nicht generisch sein.
  • Sie können instanziierbar sein, sodass sie nicht abstrakt, statisch, eine Schnittstelle oder ein byref-like-Typ sein kann.
  • Implementieren Sie ITestFilter.
  • Deklarieren Sie einen öffentlichen parameterlosen Konstruktor (jede Struktur erfüllt dies bereits).

Mindestens ein Testfilteranbieter kann pro Testassembly registriert werden, und das Übergeben eines expliziten null Filtertyps schlägt ebenfalls fehl. Bei der Zielbestimmung .NET erzwingt das generische [assembly: TestFilterProvider<MyFilter>] Formular stattdessen die Schnittstellen- und Konstruktoranforderungen über generische Einschränkungen. Daher gelten nur die Überprüfungen vom typgenerisch und "höchstens ein Anbieter" für sie.

[assembly: TestFilterProvider(typeof(MyFilter))]
public sealed class MyFilter : ITestFilter
{
    public MyFilter(string mode) { } // Violation: no public parameterless constructor
    public TestFilterResult Filter(TestFilterContext context) => TestFilterResult.Run;
}

Wie man Verstöße behebt

Fügen Sie einen öffentlichen parameterlosen Konstruktor hinzu, oder passen Sie den Typ anderweitig an, sodass er nicht generisch, instanziierbar, implementiert ITestFilterund über einen öffentlichen parameterlosen Konstruktor verfügt.

public sealed class MyFilter : ITestFilter
{
    public TestFilterResult Filter(TestFilterContext context) => TestFilterResult.Run;
}

Wann sollten Warnungen unterdrückt werden?

Sie sollten keine Warnungen von dieser Regel unterdrücken. Eine Verletzung schlägt die gesamte Testausführung zur Laufzeit fehl, anstatt nur den Filter selbst.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

#pragma warning disable MSTEST0081
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0081

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad auf none in der Konfigurationsdatei fest.

[*.{cs,vb}]
dotnet_diagnostic.MSTEST0081.severity = none

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Siehe auch