Абстрахирам моя DbContext в опит да се справя с отделните проблеми и да направя кода си годен за тестване на модули. За да направя това, измислих следния интерфейс.
Този интерфейс по-долу се хоства в сборка, наречена AllInterfaces. Този проект има препратка към EF dll поради IDbSet в декларацията по-долу.
public interface ISalesContext : IDisposable
{
IDbSet<Customer> Customers { get; }
IDbSet<Order> Orders { get; }
IDbSet<Product> Products { get; }
}
Също така създадох фалшив db набор, както следва.
public class FakeDataSet<T> : IDbSet<T> where T: class, new()
{
.......
}
Така че за моя клиентски обект този фалшив набор от данни изглежда по-долу.
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. Трябваше да добавя препратка към EF dll, тъй като интерфейсът IDbSet се споменава и в тези фалшиви класове.
След това имам проект за модулен тест, където използвам фалшиви обекти за извършване на единично тестване.
ISalesContext Context = new FakeSalesContext ();
Context.Customers.Add(new Customer() { Id = 1, LastName = "Karen" } );
Проблемът е, че този модулен тест изисква да добавя препратка към Entity framework dll. Ако премахна препратка към EF, получавам следната грешка при компилация.
Типът „System.Data.Entity.IDbSet`1“ е дефиниран в сборка, която не е реферирана. Трябва да добавите препратка към сглобяване „EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089“.
Ако премахна препратка към EF dll от сглобката на AllFakes, получавам следната грешка.
Името на типа или пространството от имена „IDbSet“ не може да бъде намерено (липсва ли ви директива за използване или препратка към асемблиране?)
Има ли смисъл да добавяте препратка към EF dll към всички тези сборки? За мен, тъй като съм абстрахирал своя db контекст, той не трябва да е необходим тук. Някакви предложения как да се постигне това?