Трябва ли единичният тестов проект да има препратка към EF dll, когато контекстът е абстрахиран

Абстрахирам моя 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 контекст, той не трябва да е необходим тук. Някакви предложения как да се постигне това?


person imak    schedule 08.10.2012    source източник


Отговори (2)


Вярвам, че имате нужда от препратка към EF dll. Вие сте абстрахирали своя контекст, но вашата абстракция все още използва IDbSet интерфейс, който е дефиниран в EntityFramework.dll. FakeSalesContext разкрива публични свойства от тип IDbSet, ако не добавите препратка към EntityFramework.dll (където е дефиниран IDbSet), нещата няма да се компилират, тъй като компилаторът няма да знае какво представлява IDbSet.

person Pawel    schedule 08.10.2012

В този случай не виждам проблем с него. Докато тествате само вашите DbContext реализации, самата справка е само за разрешаване на зависимости от вашия контекстен обект.

person IAbstract    schedule 08.10.2012