Lingua

MSTEST0063: le classi di test devono avere costruttori validi

Proprietà Value
ID della regola MSTEST0063
Titolo Le classi di test devono avere costruttori validi
Categoria Usage
La modifica è dirompente o non dirompente Non-breaking
Abilitato per impostazione predefinita Yes
Gravità predefinita Avvertimento
introdotta nella versione 4.1.0
È presente una correzione del codice NO

Motivo

Una classe di test non ha un costruttore valido. Senza iniezione nella classe di test di proprietà dell'host, i costruttori validi sono public e sono senza parametri oppure hanno un singolo parametro di tipo TestContext. Con l'iniezione posseduta dall'host, la regola convalida anche la disponibilità del costruttore pubblico, i costruttori preferiti e i tipi di parametro TestContext.

Descrizione della regola

Senza l'inserimento della classe di test di proprietà dell'host, le classi di test devono avere un costruttore pubblico che sia senza parametri o che accetti un singolo parametro TestContext. In questo modo il framework di test può istanziare correttamente la classe di test.

In tale modalità, i costruttori che non sono pubblici, che hanno parametri di tipi non supportati o che hanno più parametri non sono validi e impediscono al framework di test di creare istanze della classe di test.

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

Iniezione della classe di test posseduta dall'host

A partire da MSTest 4.5, il pacchetto sperimentale MSTest.Extensions.Hosting supporta la costruzione di classi di test dai servizi host. Quando si registra AddMSTestTestClassInjection, i costruttori pubblici possono accettare parametri di servizio e un parametro TestContext esatto facoltativo.

In questa modalità, MSTEST0063 segnala una diagnostica quando:

  • La classe di test non ha un costruttore pubblico.
  • Più di un costruttore pubblico dichiara ActivatorUtilitiesConstructorAttribute.
  • Un costruttore pubblico ha un parametro il cui tipo deriva da TestContext, anziché da TestContext stesso.

L'analizzatore riconosce anche l'iniezione gestita dall'host abilitata tramite un assembly di riferimento che registra l'associazione. Non verifica che l'host registri ogni servizio richiesto da un costruttore.

Per correggere queste violazioni, esporre un costruttore pubblico, contrassegnare al massimo un costruttore pubblico con [ActivatorUtilitiesConstructor]e sostituire i tipi di parametri derivati TestContext con TestContext. Se si disabilita l'iniezione gestita dall'host, usare le forme del costruttore standard descritte nella sezione successiva. Per le modalità di compilazione non supportate, vedere MSTEST0088.

Come correggere le violazioni

Senza l'iniezione della classe di test di proprietà dell'host, verificare che la classe di test abbia un costruttore valido. Un costruttore valido deve essere:

  1. Dichiarato come public.
  2. Senza parametri o accetta un singolo TestContext parametro.

Costruttore senza parametri

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

    [TestMethod]
    public void TestMethod()
    {
    }
}

Costruttore con TestContext

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

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

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

Costruttore senza parametri implicito

Se non si definisce alcun costruttore, il compilatore genera automaticamente un costruttore pubblico senza parametri:

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

Costruttori validi e non validi insieme

Se la classe di test ha più costruttori, almeno uno deve essere valido:

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

Quando eliminare gli avvisi

Non eliminare gli avvisi da questa regola. Non è possibile istanziare le classi di test senza costruttori validi dal framework di test, pertanto i test non verranno eseguiti.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

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

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità su none nel file di configurazione .

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Vedere anche