2

ある種の実装に依存しないフィクスチャを作成しようとしています。

次のインターフェースがあるとします。

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]属性を持つメソッドのせいだと思いますか?

基本クラスとそのメソッドが結果に表示されないようにするにはどうすればよいですか?

4

1 に答える 1

7

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
}
于 2012-04-19T09:13:33.767 に答える