懸念事項の分離に対処し、コードをユニットテスト可能にするために、DbContextを抽象化しています。それを行うために、私は次のインターフェースを考え出しました。
以下のこのインターフェースは、AllInterfacesという名前のアセンブリでホストされています。このプロジェクトには、以下の宣言のIDbSetによるEFdllへの参照があります。
public interface ISalesContext : IDisposable
{
IDbSet<Customer> Customers { get; }
IDbSet<Order> Orders { get; }
IDbSet<Product> Products { get; }
}
また、次のように偽のデータベースセットを作成しました。
public class FakeDataSet<T> : IDbSet<T> where T: class, new()
{
.......
}
したがって、私のCustomerオブジェクトの場合、この偽のデータセットは次のようになります。
public class FakeCustomerDbSet : FakeDbSet<Customer>
{
..............
}
次に、次のように偽のコンテキストを作成しました。
public class FakeSalesContext : ISalesContext
{
public FakeSalesContext ()
{
Customers = new FakeCustomerDbSet ();
}
public IDbSet<Customer> Customers { get; set; }
public IDbSet<Order> Orders{ get; private set; }
public IDbSet<Product> Products { get; private set; }
public void Dispose()
{
}
}
偽のオブジェクトに関連する上記のすべてのクラス(FakeDataSet、FakeCustomerDbSet、およびFakeSalesContext)は、アセンブリAllFakesに存在します。IDbSetインターフェイスはこれらの偽のクラスでも参照されるため、EFdllへの参照を追加する必要がありました。
次に、ユニットテストを実行するために偽のオブジェクトを使用しているユニットテストプロジェクトがあります。
ISalesContext Context = new FakeSalesContext ();
Context.Customers.Add(new Customer() { Id = 1, LastName = "Karen" } );
問題は、この単体テストでは、EntityFrameworkdllへの参照を追加する必要があることです。EF参照を削除すると、次のコンパイルエラーが発生します。
タイプ'System.Data.Entity.IDbSet`1'は、参照されていないアセンブリで定義されています。アセンブリ'EntityFramework、Version = 4.4.0.0、Culture = neutral、PublicKeyToken=b77a5c561934e089'への参照を追加する必要があります。
AllFakesアセンブリからEFdll参照を削除すると、次のエラーが発生します。
タイプまたは名前空間の名前'IDbSet'が見つかりませんでした(usingディレクティブまたはアセンブリ参照がありませんか?)
これらすべてのアセンブリにEFdllへの参照を追加することは意味がありますか?私にとって、dbコンテキストを抽象化したので、ここでは必要ありません。それを達成する方法について何か提案はありますか?