Код Entity Framework для тестирования интеграции сначала с базой данных в памяти - PullRequest
5 голосов
/ 06 мая 2011

Я хотел бы запустить реальные тесты интеграции моих репозиториев EF4.1 с базой данных в памяти, например, nyibernate-версия ayende .

У меня есть модель кода в первую очередь для устаревшей базы данных (старые таблицы и имена столбцов должны отображаться в моих объектах с использованием конфигураций кода).

Я бы хотел использовать Sqlite (или другое) для:

  1. Создание базы данных в памяти из моей модели
  2. Создать DBContext для моей модели с этой базой данных в памяти
  3. У меня уже есть IoC / DI IDBContextFactory, который создается с моими (универсальными) репозиториями (также с использованием шаблона GenericRepository)

В сети есть биты и подсказки, которые предполагают, что это должно быть возможно, но не так много для подходов, основанных на коде. Кто-нибудь знает, возможно ли это?

Некоторые фрагменты моей тестовой библиотеки, см. // THROWS ERROR пометка ошибок времени выполнения:

public class MyDbContextFactory : IDbContextFactory
  {
    private static object context;
    public object CurrentContext
    {
      get {
        if(context == null)
        {
          // ?? DOESN'T WORK AS THERE'S NO META DATA
          var connBuilder = new EntityConnectionStringBuilder();
          connBuilder.Provider = "System.Data.SQLite";
          connBuilder.Metadata = 
           @"res://*/TestEfDb.csdl|res://*/TestEfDb.ssdl|res://*/TestEfDb.msl";
          connBuilder.ProviderConnectionString = 
           ConfigurationManager.ConnectionStrings["DataContext"].Name;

          var entConnection = new EntityConnection(connBuilder.ConnectionString);

          // THROWS ERROR: sqlite Format of the initialization string does not
          // conform to specification starting at index 0
          // for connection string "Data Source=:memory:;Version=3;New=True;"

          //var entConnection = new EntityConnection
          // (ConfigurationManager.ConnectionStrings["DataContext"].Name);
          context = new MyDbContext(entConnection);
        }
        return context;
      }
    }
  }

...

 [Test]
    public void test_me()
    {
        var auditRespository = new AuditRepository(new MyDbContextFactory());
        auditRespository.GetAll<Audit>();
    }

Ответы [ 2 ]

9 голосов
/ 06 мая 2011

Используйте SQL Compact 4.0 (загрузите и SqlCE, и инструменты с помощью установщика веб-платформы) - сначала EF Code непосредственно поддерживает это. Единственная разница будет в том, что ваше приложение будет использовать строку подключения к большому SQL Server:

<add name="MyDbContext" 
     provider="System.Data.SqlClient" 
     connectionString=
       "Data Source=...;InitialCatalog=...;Integrated Security=SSPI" />

и ваши тесты будут использовать строку подключения к SQL Compact:

<add name="MyDbContext" 
     provider="System.Data.SqlServerCe.4.0" 
     connectionString="Data Source=Database.sdf" />
0 голосов
/ 10 июня 2011

Взгляните на эту статью: Подделка вашего провайдера LINQ . Он описывает, как вы можете скрыть Entity Framework за абстракцией, чтобы вы могли легко выполнить модульное тестирование своего приложения, в то же время позволяя использовать LINQ (более IQueryable) запросов к нему в коде приложения.

Обратите внимание, что это не полностью устраняет необходимость написания интеграционных тестов, поскольку вам все равно нужно будет протестировать уровень отображения базы данных и, возможно, проверить, способен ли выбранный поставщик LINQ выполнять запросы LINQ.

...