MSTEST0081: [TestFilterProvider]' moet verwijzen naar een geldig testfiltertype

Property Waarde
Regel-ID MSTEST0081
Title [TestFilterProvider]' moet verwijzen naar een geldig testfiltertype
Categorie Usage
Fix kan brekend of niet-brekend zijn Non-breaking
standaard ingeschakeld Yes
standaardniveau van ernst Warning
geïntroduceerd in versie 4.4.0 (preview)
Is er een oplossing voor de code No

Important

Deze analyzer is gepland voor MSTest 4.4 en is alleen beschikbaar in preview-versies totdat MSTest 4.4.0 wordt uitgebracht.

Oorzaak

[assembly: TestFilterProvider(typeof(MyFilter))] verwijst naar een type dat niet voldoet aan de vereisten die de adapter tijdens runtime afdwingt, of de assembly registreert meer dan één testfilterprovider.

Beschrijving van regel

[assembly: TestFilterProvider(typeof(MyFilter))] geeft het filtertype door als een Type, zodat de compiler alle typen accepteert. De adapter valideert het type alleen wanneer het filter wordt gerealiseerd en mislukt de hele uitvoering. Deze analyse rapporteert dezelfde problemen tijdens het bouwen, waar ze goedkoop zijn om op te lossen. Het type waarnaar wordt verwezen, moet:

  • Niet-algemeen zijn.
  • Kan worden geïnstantieerd, zodat het niet abstract, statisch, een interface of een byref-achtig type kan zijn.
  • Voer ITestFilter uit.
  • Declareer een openbare parameterloze constructor (elke struct voldoet al aan dit).

Maximaal één testfilterprovider kan per testassembly worden geregistreerd en het doorgeven van een expliciet null filtertype mislukt ook. Bij het instellen van .NET dwingt het algemene [assembly: TestFilterProvider<MyFilter>] formulier in plaats daarvan de interface- en constructorvereisten af via algemene beperkingen, dus alleen de controles van het algemene type en 'ten hoogste één provider' zijn nog steeds van toepassing.

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

Hoe schendingen op te lossen

Voeg een openbare parameterloze constructor toe of pas het type op een andere manier aan, zodat het niet-algemeen is, kan worden geïnstantieerd ITestFilter, geïmplementeerd en een openbare parameterloze constructor heeft.

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

Wanneer waarschuwingen onderdrukken

Onderdrukt geen waarschuwingen van deze regel. Een schending mislukt de hele testuitvoering tijdens runtime in plaats van alleen het filter zelf.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

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

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst ervan in op none in het configuratiebestand.

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

Zie Hoe u codeanalysewaarschuwingen kunt onderdrukken voor meer informatie.

Zie ook