Język

MSTEST0063: Klasy testowe powinny mieć prawidłowe konstruktory

Majątek Wartość
Identyfikator reguły MSTEST0063
Tytuł Klasy testowe powinny mieć poprawne konstruktory
Kategoria Usage
Poprawka jest przełomowa lub nieprzełomowa Non-breaking
Domyślnie włączone Tak
domyślna ciężkość Ostrzeżenie
wprowadzone w wersji 4.1.0
Czy istnieje poprawka kodu Nie.

Przyczyna

Klasa testowa nie ma prawidłowego konstruktora. Bez wstrzykiwania klasy testowej należącej do hosta prawidłowymi konstruktorami są public i są one bezparametrowe albo mają jeden parametr typu TestContext. W przypadku iniekcji zarządzanej przez hosta reguła weryfikuje również dostępność publicznego konstruktora, preferowane konstruktory i typy parametrów TestContext.

Opis reguły

Bez wstrzykiwania przez hosta klas testowych klasy testowe muszą mieć publiczny konstruktor bezparametrowy albo przyjmujący pojedynczy parametr TestContext. Dzięki temu platforma testowa może prawidłowo zainicjować klasę testową.

W tym trybie konstruktory, które nie są publiczne, mają parametry nieobsługiwanych typów lub mają wiele parametrów, są nieprawidłowe i uniemożliwiają platformie testowej tworzenie wystąpień klasy testowej.

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

Wstrzykiwanie klasy testowej należącej do hosta

Począwszy od MSTest 4.5, pakiet eksperymentalny MSTest.Extensions.Hosting obsługuje tworzenie klasy testowej na podstawie usług hosta. Podczas rejestrowania AddMSTestTestClassInjectionkonstruktory publiczne mogą przyjmować parametry usług i opcjonalny dokładny parametr TestContext.

W tym trybie MSTEST0063 zgłasza diagnostykę, gdy:

  • Klasa testowa nie ma publicznego konstruktora.
  • Więcej niż jeden publiczny konstruktor deklaruje element ActivatorUtilitiesConstructorAttribute.
  • Publiczny konstruktor ma parametr, którego typ dziedziczy po TestContext, a nie sam TestContext.

Analizator rozpoznaje również wstrzykiwanie po stronie hosta włączone za pośrednictwem referencjonowanego zestawu, który odnotowuje rejestrację. Nie sprawdza, czy host rejestruje każdą usługę wymaganą przez konstruktora.

Aby naprawić te naruszenia, uwidocznij publiczny konstruktor, oznacz co najwyżej jeden publiczny konstruktor za pomocą [ActivatorUtilitiesConstructor], i zastąp pochodne typy parametrów TestContext typami TestContext. Jeśli wyłączysz wstrzykiwanie należące do hosta, użyj standardowych form konstruktorów opisanych w następnej sekcji. W przypadku nieobsługiwanych trybów kompilacji zobacz MSTEST0088.

Jak naprawić naruszenia

Bez wstrzykiwania klasy testowej należącej do hosta upewnij się, że klasa testowa ma prawidłowy konstruktor. Prawidłowy konstruktor musi być:

  1. Zadeklarowane jako public.
  2. Albo bez parametrów, albo akceptuje pojedynczy TestContext parametr.

Konstruktor bez parametrów

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

    [TestMethod]
    public void TestMethod()
    {
    }
}

Konstruktor z TestContext

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

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

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

Niejawny konstruktor bez parametrów

Jeśli nie zdefiniujesz żadnego konstruktora, kompilator automatycznie generuje publiczny konstruktor bez parametrów:

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

Prawidłowe i nieprawidłowe konstruktory łącznie

Jeśli klasa testowa ma wiele konstruktorów, co najmniej jeden musi być prawidłowy:

[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()
    {
    }
}

Kiedy pomijać ostrzeżenia

Nie ignoruj ostrzeżeń z tej zasady. Klasy testowe bez prawidłowych konstruktorów nie mogą zostać utworzone przez platformę testową, a testy nie zostaną uruchomione.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

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

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Informacje dodatkowe