Sprache

MSTEST0063: Testklassen sollten über gültige Konstruktoren verfügen

Eigentum Wert
Regel-ID MSTEST0063
Title Testklassen sollten über gültige Konstruktoren verfügen
Kategorie Usage
Fix führt oder führt nicht zur Unterbrechung Non-breaking
Standardmäßig aktiviert Yes
Voreingestellte Schwere Warnung
wurde in Version eingeführt. 4.1.0
Gibt es eine Codekorrektur Nein

Ursache

Eine Testklasse verfügt nicht über einen gültigen Konstruktor. Ohne hostseitige Injektion von Testklassen sind gültige Konstruktoren public, die entweder parameterlos sind oder genau einen Parameter vom Typ TestContext haben. Bei der hosteigenen Injection überprüft die Regel auch die Verfügbarkeit öffentlicher Konstruktoren, bevorzugte Konstruktoren und TestContext-Parametertypen.

Regelbeschreibung

Ohne hostseitige Testklasseninjektion müssen Testklassen über einen öffentlichen Konstruktor verfügen, der parameterlos ist oder einen einzelnen TestContext-Parameter akzeptiert. Auf diese Weise kann das Testframework die Testklasse ordnungsgemäß instanziieren.

In diesem Modus sind Konstruktoren, die nicht öffentlich sind, Parameter nicht unterstützter Typen haben oder mehrere Parameter haben, ungültig und verhindern, dass das Testframework Instanzen der Testklasse erstellt.

[TestClass]
public class MyTestClass
{
    private MyTestClass() // Violation - constructor is not public
    {
    }
}
[TestClass]
public class MyTestClass
{
    public MyTestClass(string value) // Violation - parameter type is not supported
    {
    }
}
[TestClass]
public class MyTestClass
{
    public MyTestClass(TestContext testContext, int value) // Violation - multiple parameters
    {
    }
}

Hosteigene Testklasseninjektion

Ab MSTest 4.5 unterstützt das experimentelle MSTest.Extensions.Hosting Paket die Konstruktion von Testklassen aus Hostdiensten. Bei der Registrierung AddMSTestTestClassInjectionkönnen öffentliche Konstruktoren Dienstparameter und einen optionalen genauen TestContext Parameter akzeptieren.

In diesem Modus meldet MSTEST0063 eine Diagnose, wenn:

  • Die Testklasse verfügt nicht über einen öffentlichen Konstruktor.
  • Mehr als ein öffentlicher Konstruktor deklariert ActivatorUtilitiesConstructorAttribute.
  • Ein öffentlicher Konstruktor verfügt über einen Parameter, dessen Typ von TestContext und nicht von TestContext selbst abgeleitet ist.

Der Analyzer erkennt auch hosteigene Injektionen, die über eine referenzierte Assembly aktiviert sind, die die Registrierung aufzeichnet. Es wird nicht überprüft, ob der Host jeden Dienst registriert, der von einem Konstruktor benötigt wird.

Um diese Verstöße zu beheben, machen Sie einen öffentlichen Konstruktor verfügbar, markieren Sie höchstens einen öffentlichen Konstruktor mit [ActivatorUtilitiesConstructor], und ersetzen Sie abgeleitete TestContext Parametertypen durch TestContext. Wenn Sie die hosteigene Einfügung deaktivieren, verwenden Sie die im nächsten Abschnitt beschriebenen Standard-Konstruktorformen. Informationen zu nicht unterstützten Buildmodi finden Sie unter MSTEST0088.

Wie man Verstöße behebt

Stellen Sie ohne hosteigene Testklasseneinfügung sicher, dass ihre Testklasse über einen gültigen Konstruktor verfügt. Ein gültiger Konstruktor muss die folgenden Merkmale aufweisen:

  1. Deklariert als public.
  2. Entweder parameterlos oder akzeptiert einen einzelnen TestContext Parameter.

Parameterloser Konstruktor

[TestClass]
public class MyTestClass
{
    public MyTestClass()
    {
    }

    [TestMethod]
    public void TestMethod()
    {
    }
}

Konstruktor mit TestContext

[TestClass]
public class MyTestClass
{
    private readonly TestContext _testContext;

    public MyTestClass(TestContext testContext)
    {
        _testContext = testContext;
    }

    [TestMethod]
    public void TestMethod()
    {
        _testContext.WriteLine("Test is running...");
    }
}

Impliziter parameterloser Konstruktor

Wenn Sie keinen Konstruktor definieren, generiert der Compiler automatisch einen öffentlichen parameterlosen Konstruktor:

[TestClass]
public class MyTestClass
{
    [TestMethod]
    public void TestMethod()
    {
    }
}

Gültige und ungültige Konstruktoren zusammen

Wenn Ihre Testklasse über mehrere Konstruktoren verfügt, muss mindestens eine gültig sein:

[TestClass]
public class MyTestClass
{
    public MyTestClass() // Valid - this makes the class valid
    {
    }

    private MyTestClass(int x) // Invalid, but ignored because a valid constructor exists
    {
    }

    [TestMethod]
    public void TestMethod()
    {
    }
}

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keine Warnungen von dieser Regel. Testklassen ohne gültige Konstruktoren können nicht vom Testframework instanziiert werden, und die Tests werden nicht ausgeführt.

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 MSTEST0063
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0063

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

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

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

Siehe auch