2013-07-15 6 views
20

私は[設定]属性を含む基本クラスから継承するNUnitのを使用して、いくつかのテストコードを探しています: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]属性に特別なものがありますか?

+0

この問題で苦労している人のためのちょっとしたヒント: 'SetUp'メソッドがpublicであることを確認してください。 R#はプライベートだと警告しませんが、実行されません。 – lex82

+0

NUnit 2.5+の最新の回答:http://stackoverflow.com/a/22099351/532647 –

答えて

22

に理論的根拠を検討すべきです。

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

あなたは、子クラスで追加のセットアップ・ロジックを追加するには、親クラスに仮想としてSetUpをマークし、それを上書きし、そしてあなたは、基本クラスのセットアップを実行したい場合はbase.SetUp()を呼び出す必要がある場合

http://www.nunit.org/index.php?p=setup&r=2.2.10、あまりにも。

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 
} 
+0

ありがとうございます。上のコードが間違っていて、基本のSetUp()メソッドは呼び出されません。 – larryq

+0

@larryq [SetUp]属性を持つ継承チェーンに2つのメソッドがあるため、あなたの質問のコードが無効です。この問題を解決するには、SetUpで1つのメソッドしか持たず、必要に応じてオーバーライドします。 – vcsjones

+0

それは私が思ったことです、ありがとうございます。 (上記のコードは、私が取り組んでいるプロジェクトから貼り付けられていて、私が何かを逃してしまったのかどうか疑問に思っていました) – larryq

1

コンストラクタはあなたの友人です。

追加設定の動作をしたい場合は、構文がより直感的であるため、コンストラクタを使用します。

また、また、あなたは一つだけSetUpメソッドを持つことができますhttp://jamesnewkirk.typepad.com/posts/2007/09/why-you-should-.html

+1

これは完全な答えではありません。コンストラクタはこの問題をどのように解決しますか? – vcsjones

+0

私はオブジェクトを作成するときに爆発する危険がないように、できるだけ軽量なコンストラクタを保つことを好みます。 – tsells

+0

私は "プロダクション"クラスに同意しますが、覚えておいてください。私がc-torかそれ以外で例外を取った場合、どうやってそれが私に影響を及ぼしますか? – Arielr

43

以前の回答は正解でした。 1つのテストに1つの[SetUp]属性しか指定できませんでした。

NUnit 2.5以降では、[SetUp]属性で装飾された複数のメソッドを持つことができます。したがって、以下2.5+ NUnitのでは完全に有効です:

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のは、常に最初に、基本クラスの「[設定]」メソッドを実行します継承

。 1つのクラスで複数の [SetUp]メソッドが宣言されている場合、NUnitは実行順序を保証することはできません。

See here for further information

関連する問題