web-dev-qa-db-fra.com

Attribut ClassInitialize dans la classe basée sur le test unitaire non appelé

J'ai ajouté ces méthodes dans une classe TestBase:

[ClassInitialize]
public static void InitializBeforeAllTests()
{
}

Mais quand je lance dans Debug un test unitaire Test1():

[TestClass]
public class TestMapping : TestBase
{
    [TestMethod]
    public void Test1()
    {
    }

La méthode TestBase.InitializBeforeAllTests() n'est jamais appelée. Pourquoi?

39
Phil

Lors de la déclaration de l'attribut ClassInitialize sur une méthode, celle-ci doit être statique, publique, void et doit prendre un seul paramètre de type TestContext .

Si vous rencontrez également une autre méthode avec l'attribut AssemblyInitialize sur le même test unitaire, le test sera exécuté mais ignorera toutes les méthodes de test et ira directement à AssemblyCleanup ou simplement quitter.

Essayez l'exemple sur Attribut ClassInitialize dans MSDN .

11
Shaulian

pour une raison quelconque, UnitTestExecuter du framework de test unitaire ne permet de définir qu'une méthode ClassInitialize et une méthode ClassCleanup par classe de test ... contrairement aux méthodes TestInitialize et TestCleanup, qui sont appelées à la fois dans la classe de test dérivée et de base ...

8
Paul Killick

Vous pouvez configurer une méthode d'initialisation d'assembly dans votre classe de base. Pas tout à fait la même chose que ClassInitialize, mais c'est une option viable. Source: La solution de contournement mentionnée ici.

[TestClass]
public abstract class TestBase
{
    [AssemblyInitializeAttribute]
    public static void Initialize(TestContext context)
    {
        // put your initialize code here
    }
}

Vous pouvez également ajouter une méthode de nettoyage:

[AssemblyCleanup]
public static void Cleanup()
{
   //clean up stuff here
}
7
James Lawruk

Le lien MS ne fonctionne plus. Quoi qu’il en soit, une façon de contourner ce problème consiste simplement à déplacer votre code d’initialisation dans le constructeur de la classe de base. Cela garantira qu'il soit appelé depuis n'importe quelle classe descendante à chaque fois qu'elle est instanciée.

[TestClass]
public class TestBase
{
    public TestBase()
    {
        // Initialization Code
    }
}

[TestClass]
public class TestMapping : TestBase
{
    [TestMethod]
    public void Test1()
    {
        // At this point the base constructor should have been called
    }
}
1
Vince Iovacchini

Dans mon cas, l’attribut[Ignore] était appliqué (le test est exécuté manuellement)
Ceci a causé que [AssemblyInitialize] ne soit jamais appelé

Si j'ai supprimé l'attribut [Ignore], [AssemblyInitialize] a été appelé comme prévu.

Bizarrement, [AssemblyCleanup] est toujours appelé avec ou sans le [Ignore] appliqué à mon test

0
Branden Barber