Модульное тестирование Entity framework 6.1.3 DB-first

У меня возникают проблемы при использовании платформы Effort (версия 1.1.4) для модульного тестирования моего уровня БД.

У меня есть уровень БД с использованием Entity framework 6.1.3, и модель создается с использованием подхода, ориентированного на базу данных, поэтому существует файл *.edmx, описывающий модель.

Я создал частичный класс, чтобы предоставить дополнительный конструктор, используемый модульными тестами, с такими усилиями:

public partial class Entities
{
    public Entities(DbConnection connection)
        : base(connection, true)
    {
    }
}

Простой юнит-тест выглядит так:

    private Entities CreateContext()
    {
        //var connectionString = ConfigurationManager.ConnectionStrings["Entities"].ConnectionString;
        //var connection = Effort.EntityConnectionFactory.CreateTransient(connectionString);
        //return new Entities(connection as DbConnection);

        var connection = Effort.EntityConnectionFactory.CreatePersistent("name=Entities");
        var context = new Entities(connection);
        return context;
    }

    [TestMethod]
    public void Testing_Effort_Integration()
    {
        using (var context = CreateContext())
        {
            var entity = context.TableEntity.FirstOrDefault(i=> i.Id);
            Assert.IsNotNull(entity);
        }
    }

Когда я запускаю модульный тест, он выдает исключение для строки:

var connection  = Effort.EntityConnectionFactory.CreatePersistent("name=Entities");

{"Поставщик не вернул экземпляр ProviderManifest."} InnerException Message: {"Не удалось определить версию хранилища; требуется действительное подключение к хранилищу или указание версии."}

Другие сообщения, которые я нашел, предлагают изменить атрибут ProviderManifestToken в файле *.edmx с «2012» на «2008». Кажется, это решает проблему, но вместо этого дает другое исключение при попытке использовать контекст в первый раз здесь:

var entity = context.TableEntity.FirstOrDefault(i=> i.Id);

NotSupportedException Не удалось определить имя поставщика для фабрики поставщиков типа «System.Data.EntityClient.EntityProviderFactory». Убедитесь, что поставщик ADO.NET установлен или зарегистрирован в конфигурации приложения.

Кто-нибудь знает, как решить эту проблему, чтобы я мог использовать Effort с подходом Entity Framework 6.1.3 DB-first?

Мне удалось успешно использовать Effort (версия 1.1.4) для модульного тестирования слоев БД, созданных в EF 4 и EF 5, с подходом DB-first, поэтому я думаю, что EF-версия может представлять интерес...


person gurkan    schedule 12.01.2016    source источник


Ответы (1)


Мой коллега нашел решение моей проблемы!

По-видимому, я использовал пакет nuget «Effort» вместо пакета nuget «Effort.EF6». После удаления и установки другого мне также пришлось обновить свой App.Config с помощью тегов:

  <system.data>
    <DbProviderFactories>
      <add name="Effort.Provider" invariant="Effort.Provider" description="Effort.Provider" type="Effort.Provider.EffortProviderFactory,Effort" />  
    </DbProviderFactories>
  </system.data>

  <entityFramework>
    <providers>
      <provider invariantName="Effort.Provider" type="Effort.Provider.EffortProviderServices, Effort" />
    </providers>
  </entityFramework>

И я также включил вызов в SetUp для своих модульных тестов, чтобы зарегистрировать поставщика усилий:

    [SetUp]
    public void Setup()
    {
        EffortProviderConfiguration.RegisterProvider();
    }

Это решило проблему для моего. Надеюсь, это может помочь другим!

person gurkan    schedule 12.01.2016
comment
После этого я получаю следующую ошибку: System.InvalidOperationException: The Entity Framework provider type 'MyProject.Tests.EffortProviderFactory, MyProject.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' did not have a static property or field named 'Instance'. Entity Framework providers must declare a static property or field named 'Instance' that returns the singleton instance of the provider. - person Matt Koch; 10.07.2018