Должен ли проект модульного тестирования ссылаться на EF dll, когда контекст абстрагирован

Я абстрагирую свой DbContext, пытаясь рассмотреть отдельные проблемы и сделать мой код пригодным для модульного тестирования. Для этого я придумал следующий интерфейс.

Этот интерфейс ниже размещен в сборке с именем AllInterfaces. Этот проект имеет ссылку на EF dll из-за IDbSet в объявлении ниже.

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. Мне пришлось добавить ссылку на EF dll, поскольку интерфейс IDbSet также упоминается в этих поддельных классах.

Затем у меня есть проект модульного тестирования, в котором я использую поддельные объекты для выполнения модульного тестирования.

ISalesContext Context = new FakeSalesContext ();
Context.Customers.Add(new Customer() { Id = 1, LastName = "Karen" } );

Проблема в том, что этот модульный тест требует, чтобы я добавил ссылку на dll Entity framework. Если я удаляю ссылку на EF, я получаю следующую ошибку компиляции.

Тип «System.Data.Entity.IDbSet`1» определен в сборке, на которую нет ссылок. Вы должны добавить ссылку на сборку «EntityFramework, версия = 4.4.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089».

Если я удаляю ссылку на EF dll из сборки AllFakes, я получаю следующую ошибку.

Не удалось найти тип или имя пространства имен «IDbSet» (вам не хватает директивы using или ссылки на сборку?)

Есть ли смысл во все эти сборки добавлять ссылку на EF dll? Для меня, поскольку я абстрагировал свой контекст БД, он здесь не нужен. Любые предложения о том, как это сделать?


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