6

最初にEF4.1コードを使用してユニットテストを実行しようとしています。ライブデータベース(SQL Server)と単体テストDB(SQL CE)があります。EF、SQL CE 4.0、およびトランザクションサポートと戦った(そして負けた)後、テストを実行する最も簡単な方法は次のとおりであると判断しました。

  1. データベースを作成する
  2. テストを実行する
  3. データベースを削除
  4. すすぎ、繰り返します

[Setup]関数と[TearDown]関数があります。

[SetUp]
public void Init()
{
    System.Data.Entity.Database.SetInitializer(new MyTestContextInitializer());
    _dbContext = ContainerFactory.Container.GetInstance<IContext>();
    _testConnection = _dbContext.ConnectionString;
}

[TearDown]
public void Cleanup()
{
    _dbContext.Dispose();
    System.Data.Entity.Database.Delete(_testConnection);
}

問題は、System.Data.Entity.Database.SetInitializerが最初のテスト後にMyTestContextInitializerを呼び出さないことです。

したがって、2番目のテストは次のように失敗します。

System.Data.EntityException:基になるプロバイダーがOpenで失敗しました。
----> System.Data.SqlServerCe.SqlCeException:データベースファイルが見つかりません。データベースへのパスを確認してください

任意のポインタのTIA

4

3 に答える 3

7

'InitializeDatabase'を手動で呼び出すことでこれを回避しました。そのようです:

   [SetUp]
    public void Init()
    {

        var initializer = new MyTestContextInitializer();
        System.Data.Entity.Database.SetInitializer(initializer);

        _dbContext = ContainerFactory.Container.GetInstance<IContext>();
        initializer.InitializeDatabase((MyTestContext)_dbContext);

        _testConnection = _dbContext.ConnectionString;
    }

    [TearDown]
    public void Cleanup()
    {
        System.Data.Entity.Database.Delete(_testConnection);

        _dbContext.Dispose();
    }

EF4.1RCのバグかもしれないと思います。

于 2011-04-01T05:26:52.120 に答える
2

これはバグではありません。

System.Data.Entity.Database.SetInitializer

AppDomain でコンテキストが初めて作成されたときにのみ呼び出されます。したがって、単一の AppDomain ですべてのテストを実行しているため、最初のテストが実行されたときにのみ呼び出されます。

于 2011-11-16T10:10:45.117 に答える
1

私のユニットテストの奇妙な動作の原因を突き止めるのにほぼ 1 日かかりました。MSTest (管理者権限がない、またはファイルの作業コピーが何らかの理由で削除された場所)、SQL Server Express/CE (ログイン失敗?)、Unity (オブジェクトが破棄されていない?)、または Entity Framework (適切なものがない) など、あらゆる場所で原因の根本を探しました。データベースの初期化?) EFであることが判明しました。答えてくれてありがとう!

于 2012-08-15T13:55:01.127 に答える