0

型が抽象クラスでもあるジェネリック型パラメーターを取る抽象クラスを単体テストする適切な方法は何でしょうか? 例えば)

public abstract class BaseClass<T> where T : BaseT { ... }

BaseT を拡張するテスト クラスを作成する必要がありますよね??

また、BaseClass がメソッド チェーンをサポートしている場合はどうなるでしょうか。

public abstract class BaseClass<T> where T : BaseClass<T> { ... } ??

ありがとう。

2 番目のケースの具象クラスのサンプルを更新しました。

    public class ConcreteClass : BaseClass<ConcreteClass>
    {
        public ConcreteClass Method1()
        {
            return this as ConcreteClass;
        }
    }
4

3 に答える 3

3

Rhino Mocks を使用してダミーの実装クラスを実装せずにこれを行うことができます: http://www.ayende.com/wiki/Rhino+Mocks+Partial+Mocks.ashx

残念ながら、Rhino モックでは、AAA 構文ではなく、部分モックで記録/再生構文を使用する必要があります。

次の抽象クラスがあるとします。

public abstract class BaseAbstract
{
    public abstract int Increment();
}

public abstract class AbstractClass<T> where T : BaseAbstract
{
    private int inc;

    public abstract T Abstract();

    public virtual int Concrete()
    {
        return inc += Abstract().Increment();
    }
}

次の方法で Concrete の実装をテストできます。

[Test]
public void mock_an_abstract_class_with_generic()
{
    var mocks = new MockRepository();
    var baseAbstract = mocks.StrictMock<BaseAbstract>();
    var abstractClass = mocks.PartialMock<AbstractClass<BaseAbstract>>();

    using (mocks.Record())
    {
        baseAbstract.Stub(a => a.Increment()).Return(5);
        abstractClass.Stub(a => a.Abstract()).Return(baseAbstract);
    }

    using (mocks.Playback())
    {
        abstractClass.Concrete().ShouldEqual(5);
        abstractClass.Concrete().ShouldEqual(10);
    }
}

基本的には、基本クラスの部分モックを作成し、抽象メソッドに期待値を設定してから、テスト対象の具象メソッドを呼び出します。ジェネリックは単に別のモックであり、必要に応じて別の部分です。

これの欠点は、明らかに記録/再生構文の要件です。他のモッキング フレームワークがここでさらに役立つかどうかはわかりませんが、このような高度なユース ケースがある場合は、一般的に Rhino Mocks がモッキング フレームワークであることがわかりました。

于 2010-11-01T16:49:46.523 に答える
1

詳細を知らなくても、抽象ジェネリック クラスに実装されているコードをテストしようとしていると思います。たとえば、基本クラスに実装され、abstract としてマークされていないパブリック メソッドまたはプロパティをテストする場合があります。

したがって、ジェネリック基本クラス BaseClass< T > を拡張するクラスと、BaseT を拡張する別のクラスを作成する必要があります。これらをそれぞれ ConcreteClass< T > と ConcreteT と呼びましょう。

次に、タイプ ConcreteClass< ConcreteT > のクラスをインスタンス化します。このインスタンスでテストを実行できるようになり、抽象クラスのロジックをテストできるようになりました。

于 2010-11-01T20:05:16.057 に答える
0

抽象クラスをテストする方法はありません。インスタンスを作成することはできません:)

于 2010-11-01T16:38:25.640 に答える