c# – NUnitを使って汎用BaseTestを作成し、それを継承してベースからテストを実行する方法を教えてください。

だから基本的に私はドメインオブジェクトとそのオブジェクトでCRUD操作をすることができる一般的なリポジトリを持っています。

public interface IBaseRepository<T> where T : BaseEntity
{
    void Add(T entity);
    void Remove(T entity);
    T ById(int id);
    IEnumerable<T> All();
}

それで、私はこのインターフェースのいくつかの実装を持っています、それぞれのドメインオブジェクトのために。

私は(nunitを使って)いくつかの統合テストを書きたいのですが、そのために私はBaseRepositoryTestを作るだろうと考えました – このように:

public abstract class BaseRepositoryTests<T> where T : BaseEntity
{
    public abstract IBaseRepository<T> GetRepository();
    public abstract T GetTestEntity();

    [Test]
    public void AddWhenCallingAddsObjectToDatabase()
    {
        IBaseRepository<T> repository = GetRepository();
        T entity = GetTestEntity();

        repository.Add(entity);
    }
}

さて、それぞれのドメインオブジェクトに対して、リポジトリを初期化する方法とテストエンティティを作成する方法を実装する必要があります。

私がしなければならないのは、実際のテストフィクスチャを正しく書くことだけです。このような:

[TestFixture]
public class FooRepositoryTests: BaseRepositoryTests<Foo>
{
    public override IBaseRepository<Foo> GetRepository()
    {
        throw new NotImplementedException();
    }

    public override Foo GetTestEntity()
    {
        throw new NotImplementedException();
    }
}

これは私を始めて投げがそれを壊すので私に失敗したテストを与えるべきです(私はまた運なしでメソッドを実際に実装しようとしました)。しかし、テストランナー(GUIとresharpersの両方のテストランナーを試してみました)は私の基本テストを無視しています!すべて表示されますが、無視されたと報告されました。

だから私は少し掘り下げました… NUnitはあなたがどのような種類のあなたがテストしているか指定することを可能にするTextFixtureAttributeの上にこのプロパティを持っていたので私は属性を入れてみました

[TestFixture(typeof(Foo))]

まずはBaseとFooのバージョンです。 Fooバージョンにしてもまだベースからのテストを無視していて、ベースに置いていると…でも、メソッドが例外を投げるので赤に変わってしまいます。 FooTestsでは、まだ動作しません(明らかにTestFixture属性を与えられたBaseテストはどのクラスがそれから継承しているのかわからないので、実装を見つけるためにどのように知るでしょう)。

だから私は何をしなければならないのですか?基本テストクラスでテストを仮想にしてからFooBaseRepositoryTestsでそれをオーバーライドすることができます。これはbaseから実装を呼び出すためだけです。

他に何をすべきですか?私は何かが足りないのですか?助けてください、誰かが…:)

ベストアンサー
さまざまな型に使用するためにフィクスチャクラスで[TestFixture(typeof(Foo))]属性を使用している場合。抽象的ではありません。

Fooフィクスチャで使用されるなら、そのクラスは一般的であるべきであり、Fooのためにタイプされてはいけません。

ドキュメントから:

[TestFixture]
public class AbstractFixtureBase
{
    ...
}

[TestFixture(typeof(string))]
public class DerivedFixture<T> : AbstractFixtureBase
{
    ...
}

http://www.nunit.org/index.php?p=testFixture&r=2.5.5

転載記事の出典を記入してください: c# – NUnitを使って汎用BaseTestを作成し、それを継承してベースからテストを実行する方法を教えてください。 - コードログ