2012-04-19 16 views
1

私はある種の実装に依存しないフィクスチャーを作成しようとしています。NUnitテストフィクスチャーの階層

私は以下のインターフェースを持っています。

public interface ISearchAlgorithm 
{ 
    // methods 
} 

と私はそれがどのように振る舞うべきかを正確に知っているので、私はすべての派生クラスのテストの同じセットを実行したい:

public class RootSearchAlgorithmsTests 
{ 
    private readonly ISearchAlgorithm _searchAlgorithm; 

    public RootSearchAlgorithmsTests(ISearchAlgorithm algorithm) 
    { 
     _searchAlgorithm = algorithm; 
    } 

    [Test] 
    public void TestCosFound() 
    { 
     // arrange 
     // act with _searchAlgorithm 
     // assert 
    } 

    [Test] 
    public void TestCosNotFound() 
    { 
     // arrange 
     // act with _searchAlgorithm 
     // assert 
    } 
    // etc 

その後、私は、各派生クラスに対して以下の備品を作成します。

[TestFixture] 
public class BinarySearchTests : RootSearchAlgorithmsTests 
{ 
    public BinarySearchTests(): base(new BinarySearchAlgorithm()) {} 
} 

[TestFixture] 
public class NewtonSearchTests : RootSearchAlgorithmsTests 
{ 
    public NewtonSearchTests(): base(new NewtonSearchAlgorithm()) {} 
} 

R#テストランナーとNUnit GUIの両方が基本クラステストを示していることを除けば、うまくいきます。もちろん、適切なコンストラクターがないので失敗します。

[TestFixture]と記されていないと、なぜそれも実行されますか?私は[Test]属性のメソッドのためだと思いますか?

どのようにして基本クラスを防止でき、そのメソッドが結果に表示されないのですか?

答えて

6

NUnitでGeneric Test Fixturesを使用すると、必要なものが得られます。

[TestFixture(typeof(Implementation1))] 
[TestFixture(typeof(Implementation2))] 
public class RootSearchAlgorithmsTests<T> where T : ISearchAlgorithm, new() 
{ 
    private readonly ISearchAlgorithm _searchAlgorithm; 

    [SetUp] 
    public void SetUp() 
    { 
     _searchAlgorithm = new T(); 
    } 

    [Test] 
    public void TestCosFound() 
    { 
     // arrange 
     // act with _searchAlgorithm 
     // assert 
    } 

    [Test] 
    public void TestCosNotFound() 
    { 
     // arrange 
     // act with _searchAlgorithm 
     // assert 
    } 
    // etc 
} 
+0

このソリューションには空のコンストラクタ要件の欠点があります。このコードでは、表示されたコンストラクタがその時点で空であっても避けたいと考えています。私は何らかのコンストラクト関数を渡すことができると思います。私はそれを調べなければなりません。ありがとう。 – Grozz

+0

Generic Test Fixtures with Parametersを使用して、コンストラクタにパラメータを渡すことができると思います。 –