22

RailsDjango のテスト アプローチで私が気に入っている点の 1 つは、フィクスチャを使用して、各テストを実行する前にデータベースをセットアップできることです。

以前は、厳密な単体テストとモック化されたリポジトリを組み合わせてコードをテストしていましたが、統合テストを行うために、前述のテスト アプローチと同じくらい使いやすいものが欲しいです。

コード ファーストと EF 5 でのこの種のサポートの話は聞いたことがありますが、それが Rails と Django が提供するレベルまで上がるかどうかはわかりません。

確かに、それに匹敵するものはあります。どんな情報でも大歓迎です!

4

2 に答える 2

14

EF5 では、 Migrationsと呼ばれる新しい概念が導入されました。おそらく、Rails や Django アプリケーションで似たようなものを使用していたことでしょう。

マイグレーションは、DB のバージョンをアップグレード/ダウングレードするためのいくつかの機能を持つクラスです。

public partial class VoteTime : DbMigration
{
    public override void Up()
    {
        AddColumn("Votes", "Time", c => c.DateTime(nullable:false, defaultValue:DateTime.UtcNow));
    }

    public override void Down()
    {
        DropColumn("Votes", "Time");
    }
}

また、コード ファースト アプローチが機能するように、DbContext および DbMigrationsConfiguration 構成クラスをセットアップする必要があります。

テスト目的で導入する必要があるのは、TestDatabaseInitilizer

public class TestDatabaseInitilizer : DropCreateDatabaseAlways<DbContext>
{

}

単体テスト用のテストデータベースの初期化を担当します。

最後に、コンテキストを設定するテスト コードを設計する必要があります。

public class SomeRepositoryTests
{
    private DbContext _context;

    [SetUp]
    public void Setup()
    {
        Database.SetInitializer(new TestDatabaseInitilizer());
        _context = new DbContext("TestContext");
        _repository = new SomeRepository(_context);
    }

    [Test]
    public void should_return_some_entities()
    {
        Assert.That(_repository.Get(), Is.Not.Null);
    }
}

必要に応じて、セットアップ コードを基本クラスに移動できます。

于 2012-07-09T06:25:23.157 に答える
8

600 以上の自動化された統合テストを持つ Entity Framework を使用してアプリケーションを開発しました。これは私が使用したプロセスです:

  • Entity Framework コードの最初の移行は、データベース構造 (テーブル、インデックスなど) を設定するためだけです。移行を使用してデータをシードしません。

  • データベースを特定の既知の状態に設定する SQL スクリプト。たとえば、ASP.NET メンバーシップ ユーザーを挿入する 1 つのスクリプト。最も関連性の高いテーブルのサンプル データを設定する別のテーブル。より具体的なシナリオのその他。通常、スクリプトは適切なテーブルからレコードを削除し、適切な順序で再度挿入して、関係の競合を回避します。スクリプトは、埋め込みリソースとして Visual Studio プロジェクトに含まれています。

  • 名前でリソースからスクリプトを取得し、データベースに対して実行できるヘルパー クラス。"GO" を使用したコマンドのバッチ処理が含まれます。そのために ConnectionContext.ExecuteNonQuery を使用できます。

  • テスト スイート全体の開始時に、ユーザー、アクセス許可、およびその他の非常に一般的な環境構成を設定するスクリプトを実行します。

  • 各テスト メソッドの前に、必要に応じて 1 つまたは複数のスクリプトを実行して、実行中のテストに必要なコンテキストでデータベースを設定します。たとえば、データの読み取り、挿入、更新、および削除を行う一連の CRUD テストの前に、適切なテーブルにテスト データをシードするスクリプトを実行します。

  • データベースが特定のコンテキストに設定されていると仮定して、テスト ケースを記述します。たとえば、更新操作のテストでは、既知のキーを使用してレコードを取得し、更新してから再度読み取って、データベースで更新されたかどうかを確認しようとします。

SQL スクリプトは、Rails フィクスチャほど読み書きが簡単ではありませんが、非常に高速であり、必要なあらゆる種類の操作 (DELETE、INSERT、UPDATE、ストアド プロシージャの実行など) を実行できます。

この手法は、50 のデータベース テーブルと非常に複雑なビジネス ルールとプロセスを含むプロジェクトで十分に証明されました。これにより、テストがシンプルで一貫したものになりました。

于 2012-07-12T17:30:19.177 に答える