web-dev-qa-db-fra.com

NUnit et [SetUp] dans les classes de base

J'examine un code de test utilisant NUnit, qui hérite d'une classe de base contenant un attribut [SetUp]:

public class BaseClass
{
   [SetUp]
   public void SetUp()
   {
     //do something
   }

}

[TestFixture]
public class DerivedClass : BaseClass
{
  [SetUp]
  public void SetUp()
  {

   //do something else, with no call to base.SetUp()
  }
   //tests run down here.
   //[Test]
   //[Test]
   //etc
}

La classe dérivée aura certainement besoin du travail effectué dans la méthode SetUp () de la classe de base.

Suis-je en train de manquer quelque chose, ou la méthode SetUp () dans la classe de base ne sera-t-elle pas appelée lorsque les tests de la classe dérivée seront exécutés? Y a-t-il quelque chose de spécial avec l'attribut [SetUp] qui garantit que l'un sera appelé avant l'autre?

40
larryq

Vous ne pouvez avoir qu'une seule méthode SetUp.

Un TestFixture ne peut avoir qu'une seule méthode SetUp. Si plusieurs sont définis, TestFixture se compilera correctement, mais ses tests ne s'exécuteront pas.

http://www.nunit.org/index.php?p=setup&r=2.2.1

Si vous devez ajouter une logique de configuration supplémentaire dans une classe enfant, marquez SetUp comme virtuel dans votre classe parente, remplacez-la et appelez base.SetUp() si vous souhaitez que la configuration de la classe de base s'exécute également .

public class BaseClass
{
   [SetUp]
   public virtual void SetUp()
   {
     //do something
   }

}



[TestFixture]
public class DerivedClass : BaseClass
{
  public override void SetUp()
  {
   base.SetUp(); //Call this when you want the parent class's SetUp to run, or omit it all together if you don't want it.
   //do something else, with no call to base.SetUp()
  }
   //tests run down here.
   //[Test]
   //[Test]
   //etc
}
31
vcsjones

Avant NUnit 2.5, les réponses précédentes étaient correctes; vous ne pouviez avoir qu'un seul [SetUp] attribut pour un test.

Avec NUnit 2.5, vous pouvez avoir plusieurs méthodes décorées avec le [SetUp] attribut. Par conséquent, ce qui suit est parfaitement valide dans NUnit 2.5+:

public abstract class BaseClass
{
    [SetUp]
    public void BaseSetUp()
    {
        Debug.WriteLine("BaseSetUp Called")
    }
}

[TestFixture]
public class DerivedClass : BaseClass
{
    [SetUp]
    public void DerivedSetup()
    {
        Debug.WriteLine("DerivedSetup Called")  
    }

    [Test]
    public void SampleTest()
    {
        /* Will output
         *    BaseSetUp Called
         *    DerivedSetup Called
        */
    }
}

Lors de l'héritage, NUnit exécutera toujours la méthode '[SetUp]' dans la classe de base en premier. Si plusieurs [SetUp] les méthodes sont déclarées dans une seule classe NUnit ne peut garantir l'ordre d'exécution.

Voir ici pour plus d'informations .

65
Luke Merrett