Единый тест с реальной базой данных в схеме хранилища?C#

Место общения программистов C#
Anonymous
Единый тест с реальной базой данных в схеме хранилища?

Сообщение Anonymous »

У меня есть ASP.NET CORE WebAPI и сервисы. Чтобы абстрагировать EF Core dbcontext из уровня службы, я решил использовать шаблон репозитория.
Однако репозиторий содержит логику, которая не может быть протестирована с макетными библиотеками (я попробовал moq ) или с Inmemory Поставщик базы данных. Реальная база данных или это интеграционный тест ? Я использую шаблон хранилища неправильного, так как не могу контролировать его с помощью макета или базы данных Inmemory?

Код: Выделить всё

public class UrlRepository(AppDbContext dbContext, IMemoryCache memoryCache) : IUrlRepository
{
private readonly AppDbContext _dbContext = dbContext;
private readonly IMemoryCache _memoryCache = memoryCache;

public virtual async Task DeleteUrlAsync(Guid urlId)
{
int rows = await _dbContext.Urls
.Where(u => u.Id == urlId)
.ExecuteDeleteAsync(); // Cannot mock it and cannot use InMemory provider since exception will be thrown (See here https://stackoverflow.com/a/74907535/23143871).

if (rows > 0)
{
_memoryCache.Remove($"{CacheKeys.UrlId}-{urlId}");
}

return rows;
}

public virtual async Task
> GetAllUrlDtoAsync(int pageNumber, int pageSize)
{
var query = _dbContext.Urls.AsNoTracking(); // Cannot mock it since it is an extension method

var totalCount = await query.CountAsync();
var totalPages = (int)Math.Ceiling((double)totalCount / pageSize);

var urls = await query
.Skip((pageNumber - 1) * pageSize) // Cannot mock it since it is an extension method
.Take(pageSize)
.Select(UrlEntityProjection.UrlDto)
.ToListAsync();

return urls.ToPagination(u => u, totalCount, totalPages, pageNumber, pageSize);
}
}
Как видите, репозиторий содержит код, который нельзя высмеивать или использовать с провайдером Inmemory
для тестирования интеграции я использую testContainers . Но должен ли я использовать его, чтобы проверить этот класс? На данный момент я придумал решение для использования: sqlite db -> Применить ожидающие миграции -> Удалить базу данных в конце теста.

Подробнее здесь: https://stackoverflow.com/questions/794 ... ry-pattern

Вернуться в «C#»