0

一般的なテストを再利用したいのですが、一般的なテストデータを取得するにはどうすればよいですか?


私は自分のIReadOnlyCollection<T>インターフェースを書き、それを使用するいくつかのクラスを書きました。

そのインターフェイスのメソッドとプロパティ(たとえばContainsCopyTo)は、それを実装するクラスに関係なく常にまったく同じように機能する必要があるため、任意の実装に適用できる汎用テストを作成したいと思います。この投稿で提案されているアプローチを使用すると、次のようになります。

// Tests that must work for any type T:
public abstract class IReadOnlyCollectionTests<T>
{
    protected abstract IReadOnlyCollection<T> CreateInstance(params T[] data);

    [Test]
    public void Contains_GivenExistingValue_ReturnsTrue()
    {
        // Given
        T[] data;   // <-- Get some data?
        T value = data[1];
        var sut = CreateInstance(data);

        // When
        bool result = sut.Contains(value);

        // Then
        Assert.IsTrue(result);
    }

    // 40 more such tests...
}

ここで、テストするデータが必要です。タイプTはブール値、文字列、またはその他のいずれかです。どのタイプでも機能する一般的なデータをそこに取得するにはどうすればよいTですか?


ちなみに、この一般的なテストは、実装ごとにテストクラスを派生させて実行します。たとえば、私のBitArray実装(ブール値のコレクション)の場合のように、次のようになります。

[TestFixture]
public class BitArrayROC : IReadOnlyCollectionTests<bool>
{
    protected override IReadOnlyCollection<bool> CreateInstance(params bool[] data)
    {
        return new BitArray(data);
    }
}

と同様にBitArray、実装StringCollectionをテストしたいクラスがあります(とりわけ) 。IReadOnlyCollection<T>

4

2 に答える 2

1

パラメーターごとにデータを返すデータプロバイダーを作成し、パラメーターを必要なデータのタイプにします。一般的なテストの実装に必要なデータのタイプを設定できます。

于 2013-01-18T23:54:07.460 に答える
0

クラスdataに戻る抽象メソッドを作成できます。IReadOnlyCollection<T>次に、派生クラスで、タイプ固有の実装を記述できます。

例を参照してください:

public abstract class IReadOnlyCollectionTests<T>
{
    protected abstract IReadOnlyCollection<T> CreateInstance(params T[] data);

    protected abstract T[] GetData();

    [Test]
    public void Contains_GivenExistingValue_ReturnsTrue()
    {
        // Given
        T[] data = GetData();
        T value = data[1];
        var sut = CreateInstance(data);

        ...
    }
}

[TestFixture]
public class BitArrayROC : IReadOnlyCollectionTests<bool>
{
    protected override bool[] GetData()
    {
        return new[] { true, false };
    }

    ...
}

実際、考え方はコレクションインスタンスの作成に実装したものと同じです。

于 2013-01-19T09:21:54.830 に答える