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

c# effort entity-framework stored-procedures unit-testing

Вопрос

У меня есть функция, вызывающая хранимую процедуру с 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. У меня уже есть Effort (и база данных NMemory) для имитации базы данных (основанной на моем контексте), на Initialize для каждого модульного теста, например:

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

Где EffortProviderFactory :

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

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

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

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

Принятый ответ

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

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

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

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




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему