Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
| 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.