2009-09-29 9 views
5

私はnUnitでテストしています。私は私のIFooインターフェイスに対して実行される一連のテストを持っています。テストフィクスチャセットアップは、どのIFoo実装を読み込んでテストするかを決定します。テストスイートを複数の実装で再利用していますか?

IFooの実装のリストに対して同じスイートを実行する方法を理解しようとしていますが、手動でセットアップを変更しないですべての実装をテストする方法はありません。

誰でもこの問題に取り組んでいますか?

+0

グレートソリューション。私はユニットテストを継承することは決して考えなかったでしょう。また、nUnitがベースクラスのメソッドもテストすることは決してありませんでした。 – Chris

答えて

11

テストが含まれている基本テストクラスは、このようIFoo実装間で共有を作成します。

// note the absence of the TestFixture attribute 
public abstract class TestIFooBase 
{ 
    protected IFoo Foo { get; set; } 

    [SetUp] 
    public abstract void SetUp(); 

    // all shared tests below  

    [Test] 
    public void ItWorks() 
    { 
     Assert.IsTrue(Foo.ItWorks()); 
    } 
} 

今、テストにしたい各実装のための非常に小さな派生クラスを作成します。

[TestFixture] 
public class TestBarAsIFoo : TestIFooBase 
{ 
    public override void SetUp() 
    { 
     this.Foo = new Bar(); 
    } 
} 

編集:明らかにNUnitもparameterized test fixturesをサポートしています。パラメータ型の汎用テストフィクスチャもサポートされています。リンクされたドキュメントの例:それはタイプのnew()制約を有しているため

[TestFixture(typeof(ArrayList))] 
[TestFixture(typeof(List<int>))] 
public class IList_Tests<TList> where TList : IList, new() 
{ 
    private IList list; 

    [SetUp] 
    public void CreateList() 
    { 
    this.list = new TList(); 
    } 

    [Test] 
    public void CanAddToList() 
    { 
    list.Add(1); list.Add(2); list.Add(3); 
    Assert.AreEqual(3, list.Count); 
    } 
} 

この例では、ビット単純です。しかし、Activator.CreateInstanceを使用し、TestFixture属性のIFoo実装のコンストラクタ引数を渡すこともできます。これを実現するにはいくつかの方法の

+1

最初にそこに行くための+1。 ;) – TrueWill

+0

パラメータ化されたテストフィクスチャは真剣に涼しい!ちょうどそれを2つの実装をテストするために追加しました。素晴らしいことは、各実装がその処理を行うのにかかる時間を見ることができることです。 + 1 –

1

ワン:

public interface IFoo 
{ 
    string GetName(); 
} 

public class Foo : IFoo 
{ 
    public string GetName() 
    { 
     return "Foo"; 
    } 
} 

public class Bar : IFoo 
{ 
    public string GetName() 
    { 
     return "Bar"; // will fail 
    } 
} 

public abstract class TestBase 
{ 
    protected abstract IFoo GetFoo(); 

    [Test] 
    public void GetName_Returns_Foo() 
    { 
     IFoo foo = GetFoo(); 
     Assert.That(foo.GetName(), Is.EqualTo("Foo")); 
    } 
} 

[TestFixture] 
public class FooTests : TestBase 
{ 
    protected override IFoo GetFoo() 
    { 
     return new Foo(); 
    } 
} 

[TestFixture] 
public class BarTests : TestBase 
{ 
    protected override IFoo GetFoo() 
    { 
     return new Bar(); 
    } 
} 
関連する問題