Создать хранимую процедуру в базе данных Effort для модульного теста

У меня есть функция, вызывающая хранимую процедуру с Entity Framework:

public async Task<List<Entity>> GetEntity(int id)
{
       var param = new SqlParameter("@id", id);
       return await myContext.Database
           .SqlQuery<MyEntity>("[myStoredProcedure] @id", param)
           .ToListAsync();
}

И я хотел бы создать для него модульный тест с использованием Effort. У меня уже есть усилие (и база данных NMemory) для имитации базы данных (на основе моего контекста), на Initialize для каждого модульного теста, как:

[TestInitialize]
public void Initialize()
{
     Effort.Provider.EffortProviderConfiguration.RegisterProvider();
     EffortProviderFactory.ResetDb()
     using (var context = new MyContext("PWET"))
     {
          context.Database.CreateIfNotExists();
          context.Constructeurs.Add(new Constructeur { Nom = "Zebra" });
          context.Constructeurs.Add(new Constructeur { Nom = "Joya" });
          context.SaveChanges();
     }
}

куда EffortProviderFactory является:

public class EffortProviderFactory : IDbConnectionFactory
{
    private static DbConnection _connection;
    private readonly static object _lock = new object();

    public static void ResetDb(){
        lock (_lock){
            _connection = null;
        }
    }
    public DbConnection CreateConnection(string nameOrConnectionString)
    {
        lock (_lock){
            if (_connection == null)
                _connection = Effort.DbConnectionFactory.CreateTransient();
            return _connection;
        }
    }
}

Я тестировал добавление создания хранимой процедуры следующим образом:

[TestInitialize]
public void Initialize()
{
     Effort.Provider.EffortProviderConfiguration.RegisterProvider();
     EffortProviderFactory.ResetDb()
     using (var context = new MyContext("PWET"))
     {
          context.Database.CreateIfNotExists();
          context.Database.ExecuteSqlCommand(@"
CREATE PROCEDURE [dbo].[myStoredProcedure]
@id INT = 0
AS
BEGIN

SELECT foo
FROM bar 
WHERE foo.Id = @id

ORDER BY foo.Id;
END");
     }
}

Но это бросает NotSupportedException, Как я могу это сделать, и как лучше?

1 ответ

Решение

Effort - это поставщик баз данных в памяти, который предоставляет DbContext экземпляр с частной временной базой данных: новый контекст, новая база данных, отсутствие тестовых взаимодействий. Это хорошая часть.

Недостатком, конечно, является то, что он не является - и никогда не будет - полноценным ядром базы данных. Поэтому он никогда не будет поддерживать хранимые процедуры, написанные на каком-либо из распространенных диалектов SQL (например, t-SQL или PL-SQL). Насколько Effort (т.е. NMemory) имеет хранимые процедуры, это просто IQueryable Как видно из StoredProcedure конструктор Отмечая удаленно связанные с хранимыми процедурами t-SQL.

Единственный способ проверить хранимые процедуры в коде уровня доступа к данным, что является очень хорошей идеей, - это написать интеграционные тесты. Существует примерно два подхода к тому, чтобы сделать интеграционные тесты независимыми друг от друга:

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

Другие вопросы по тегам