Однако репозиторий содержит логику, которая не может быть протестирована с макетными библиотеками (я попробовал 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);
}
}
для тестирования интеграции я использую testContainers . Но должен ли я использовать его, чтобы проверить этот класс? На данный момент я придумал решение для использования: sqlite db -> Применить ожидающие миграции -> Удалить базу данных в конце теста.
Подробнее здесь: https://stackoverflow.com/questions/794 ... ry-pattern