Проблема усилий при тестировании

c# .net entity-framework unit-testing

762 просмотра

1 ответ

62 Репутация автора

Я читал об использовании Effort для модульного тестирования, потому что «легко» настроить базу данных в памяти. Я пытался реализовать это в моей службе тестовых данных, но у меня постоянно возникают проблемы. Я использую Entity Framework 6 и модели, которые были сгенерированы из существующих таблиц.

Контекстная модель

public partial class Entities : DbContext
{
    public Entities()
        : base("name=Entities")
    {
    }

    //Overloading for effort unit test
    public Entities(DbConnection connection) : base(connection,true)
    {

    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //throw new UnintentionalCodeFirstException();
    }

    public virtual DbSet<REPAIR_CHECK_IN_TABLE> REPAIR_CHECK_IN_TABLEs { get; set; }
    public virtual DbSet<tblPlanarWarranty> tblPlanarWarranties { get; set; }
}

Тестовый DataService

private IDataLoader loader;
    private Entities context;


    public TestDataService()
    {

        loader = new Effort.DataLoaders.CsvDataLoader(@"_TestDataFiles\");
        context = new Entities(Effort.DbConnectionFactory.CreateTransient(loader));
    }

Первоначально я получил бы следующую ошибку.

Отсутствует поставщик Entity Framework для поставщика ADO.NET с инвариантным именем Effort.Provider.

Затем я добавил упомянутого провайдера в раздел провайдера файла конфигурации приложения и начал получать эту ошибку.

Элемент 'Instance' типа провайдера Entity Framework 'Effort.ProviderServices, Effort, Version-1.0.0.0 не возвращал объект, который наследуется от' System.Data.Entity.Core.Common.DBProviderServices '

У кого-нибудь есть понимание того, что я делаю неправильно? На сайте это было так просто, как несколько строк, но это превратилось в огромный беспорядок.

Автор: HighARc Источник Размещён: 18.07.2016 04:15

Ответы (1)


0 плюса

14664 Репутация автора

Быть осторожен! При использовании EF6 не устанавливайте Effort от ZZZ Projects !

Установите Effort.EF6 по тем же проектам ZZZ

class SchoolDbContext : DbContext
{
    // the standard constructors you probably already use:
    public SchooldDbContext() : base(...) {}
    public SchoolDbContext(string nameOrConnectionString) : base(nameOrConnectionString) {}

    // add this one for effort:
    public SchoolDbContext(DbConnection existingConnection, bool contextOwnsConnection) 
        : base(existingConnection, contextOwnsConnection) { }

    ... // DbSets, etc

Используйте чистую пустую базу данных

var dbConnection = Effort.DbConnectionFactory.CreateTransient();
using (var dbContext = new SchoolDbContext(dbConnection, true)
{
      dbContext.Schools.Add(new School {...});
      dbConext.SaveChanges();

      // this database exists as long as the connection exists
      var schoolCount = dbContext.Schools.Count();
      // expect one school
}

// a new empty database will be created: there won't be any schools
dbConnection = Effort.DbConnectionFactory.CreateTransient();
using (var dbContext = new SchoolDbContext(dbConnection)
{
     var schoolCount = dbContext.Schools.Count();
     // expect no schools
}

Повторное использование базы данных

эта база данных будет сохранена на время вашей программы. Модель будет складываться только один раз.

const string dbName = "MyDb"
var dbConnection = Effort.DbConnectionFactory.CreatePersistent(dbName);
using (var dbContext = new SchoolDbContext(dbConnection)
{
      dbContext.Schools.Add(new School {...});
      dbContext.SaveChanges();
}

dbConnection = Effort.DbConnectionFactory.CreatePersistent(dbName);
using (var dbContext = new SchoolDbContext(dbConnection)
{
     var schoolCount = dbContext.Schools.Count();
     // expect the school you just added
}
Автор: Harald Coppoolse Размещён: 04.12.2018 02:24
Вопросы из категории :
32x32