2017-10-12 4 views
0

このアプリケーションでは、テストは行われていませんでした。
現在私は受け入れと単体テストを書くことができるように私たちのコードをリファクタリングしています。そうするには、データベースの抽象化が必要です。 ORMとしてEntity Framework 6を​​使用します。InMemoryDatabase System.Data.Entity.Databaseプロパティを偽装する

私はインターフェイスを実装するInMemoryDbクラスを作成しました。これもEF-Contextで実装されています。

EF-DbContextクラスは、タイプSystem.Data.Entity.DatabaseDatabaseと呼ばれるプロパティを提供します。 EntitiesはタイプInMemoryDbである受け入れテストの場合は

Connection = (SqlConnection)dbBase.Entities.Database.Connection; 

どこ:

残念ながら我々のコードでは、このプロパティは、このような例のために何度も使用されています。 アクセプタンステストでは、Databaseプロパティがnullであり、プロパティを正しく設定する方法がわかりません。

私はこのようなコンストラクタでそれを初期化しようとしたが、それは動作しません:

public class InMemoryDb : IEfContext, IInMemoryDb 
{ 
    public InMemoryDb() 
    { 
     this.per_person = new TestDbSet<per_person>(); 
     this.Database = new Database(null); 
    } 
    public void Dispose() 
    { 
     throw new System.NotImplementedException(); 
    } 

    public Task<int> SaveChangesAsync() 
    { 
     throw new System.NotImplementedException(); 
    } 

    public Database Database { get; } 

    public DbSet<per_person> per_person { get; set; } 

    [...] 
} 
  • 実際のデータベースのISNていることを確認しmakeingながら、このプロパティを設定するための正しい方法は何ですか使用されていませんか?

私はそれはあなたを助けることを願っ事前

+0

データベースコンテキストを使用していませんか? –

+0

私は生産コードを使用していますが、私のテストコード(受け入れテスト)では、実際のデータベース – xeraphim

+0

アプリケーション全体の "パイプライン"をテストするための "Acceptence tests"の目的 - すべてのレイヤーが正しく統合されていることを知っているからですテストは "統合テスト"と密接に関連しています。を実装する実際のコードで使われている部分です。それが不可能な場合は、「.Database」プロパティーを使用するパーツを別の抽象化の背後に置き、アプローチ:再設計アプリケーションを変更するか、または「実際に」受け入れテストを実行するために実データベースまたはSQLLightデータベースを使用する方が良いでしょう – Fabio

答えて

0

に感謝します。 Effort.EF6をご覧ください。そのlibは、アプリケーション全体のデータ(NMemoryの助けを借りてベースメモリ内のメモリを設定します。 私はすでに私たちのアプリケーションで使っており、魅力的で使いやすいです。 SQL Serverのような外部の物理的依存関係またはSQLサーバーのデータベース