46

[SetUp] 属性を含む基本クラスから継承する NUnit を使用したテスト コードを見ています。

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
}

派生クラスでは、基本クラスの SetUp() メソッドで行われた作業が確実に必要になります。

それとも、派生クラスのテストが実行されたときに基本クラスの SetUp() メソッドが呼び出されないのでしょうか? [SetUp] 属性には、一方が他方よりも先に呼び出されることを保証する特別なものがありますか?

4

2 に答える 2

80

NUnit 2.5 より前は、以前の回答は正しかったです。[SetUp]テストには 1 つの属性しか持てません。

NUnit 2.5 以降では、[SetUp]属性で装飾された複数のメソッドを持つことができます。したがって、以下は 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
        */
    }
}

NUnit を継承する場合、常に最初に基本クラスの '[SetUp]' メソッドが実行されます。1 つのクラスで複数の[SetUp]メソッドが宣言されている場合、NUnit は実行順序を保証できません。

詳しくはこちらをご覧ください

于 2014-02-28T15:34:00.593 に答える
37

メソッドは 1 つしか使用できませんSetUp

TestFixture は、SetUp メソッドを 1 つだけ持つことができます。複数が定義されている場合、TestFixture は正常にコンパイルされますが、そのテストは実行されません。

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

子クラスに追加のセットアップ ロジックを追加する必要がある場合はSetUp、親クラスで仮想としてマークし、それをオーバーライドして、base.SetUp()基本クラスのセットアップも実行する場合は呼び出します。

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
}
于 2013-07-15T16:44:16.390 に答える