14

ASP.NET Web API プロジェクトの単体/統合テストを作成しようとしていますが、各テストを個別に実行するのに苦労しています。説明させてください。

展開設定が構成された *.testsettings ファイルがあります。各テストを実行する前に、空の *.mdf ファイルがテストの場所に展開されます。Entity Framework Code First を使用しているため、データベース初期化子を使用してスキーマをデータベースにプッシュし、特定のテーブルに 2 行をシードできます。これはうまくいきます。

私が直面している問題は、すべての ApiControllers のアクションに対するさまざまなテストが、間違った順序で実行されると、お互いに足を踏み入れる可能性があることです。たとえば、POST テストの前に GET テストを実行すると、GET は 2 つのオブジェクトを返し、逆の順序で実行すると GET は 3 つのオブジェクトを返します。

私がする必要があると思うのは、すべてのテストの前にデータベースを削除し、再作成し、再シードすることです。これは良い考えですか、それとももっと良い方法がありますか? これが私にできる最善のことであれば、各テストの前にデータベースをリセットするつもりです.

4

3 に答える 3

23

これが私が興味のある人のためにやったことです。

Seedメソッドを拡張DropCreateDatabaseAlways<TContext>してオーバーライドし、単体テストが信頼できる既知のテストデータをデータベースに入力しました。

public class MyDatabaseInitializer : System.Data.Entity.DropCreateDatabaseAlways<MyDbContext>
{
    protected override void Seed(MyDbContext context)
    {
        // Add entities to database.

        context.SaveChanges();
    }
}

[AssemblyInitialize]次に、データベース初期化子を設定するメソッドを実装しました。

[TestClass]
public class Global
{
    [AssemblyInitialize]
    public static void AssemblyInitialize(TestContext context)
    {
        System.Data.Entity.Database.SetInitializer(new MyDatabaseInitializer());
    }
}

これにより、データベースの初期化子が設定されますが、実際には実行されません。intitializerは、[TestInitialize]各テストの前にデータベースを強制的に削除、再作成、および再シードする、私が作成したメソッドで実行されます。

[TestClass]
public class MyTestClass
{
    [TestInitialize]
    public void TestInitialize()
    {
        MyDbContext context = new MyDbContext();
        context.Database.Initialize(true);
    }

    [TestMethod]
    public void MyUnitTest()
    {
        Assert.IsTrue(true);
    }
}
于 2012-12-21T14:36:23.860 に答える
6

テストを開始する前にデータベースを再作成し、それぞれを常にロールバックするトランザクションにラップすることをお勧めします。これは、再作成ステージが完了するまでに時間がかかる場合 (たとえば、実行する必要があるアクションのためなど) に非常に役立ちます。

于 2012-12-06T08:12:39.983 に答える
1

現在のセットアップでは、各クラスがロードされる前にデータベース スキーマを再作成し (ClassInitialize 属性を使用しますが、これは間違いなく AssemblyInitialize に移動できます)、各テスト実行の前後に適切なレコードを使用してデータベースをシード/クリーンアップします ( TestInitialize/TestCleanup 属性を使用)。

詳細: http://msdn.microsoft.com/en-us/library/ms379625(v=vs.80).aspx

于 2012-12-05T22:45:19.893 に答える