Я написал веб-приложение на C #, MVC, Entity-Frame, LINQ и т. Д., И теперь я хочу задним числом создать модульные тесты для всего проекта.
Я понимаю, что для написания эффективных модульных тестов мне нужно создать репозитории для моделей, чтобы их можно было смоделировать, и, таким образом, структура сущности будет делать любые обращения к базе данных.
У меня 3 основных модели; Категория, пароль, пароль пользователя.
Категории содержат категории и пароли. И пароли содержат UserPasswords (которые ссылаются на учетные записи пользователей). Итак, я создал 3 репозитория с основными методами, такими как; Создать, удалить, обновить и т. Д.
Однако, глядя на этот запрос LINQ:
var selectedCategoryItem = DatabaseContext.Categories
.Where(c => c.CategoryId == ParentCategoryId)
.Include(c => c.SubCategories)
.Include(c => c.Passwords)
.Include(c => c.Passwords.Select(p => p.Creator))
.ToList()
.Select(c => new Category()
{
SubCategories = c.SubCategories
.Where(sub => !sub.Deleted)
.OrderBy(sub => sub.CategoryOrder)
.ToList(), //make sure only undeleted subcategories are returned
Passwords = c.Passwords
.Where(pass => !pass.Deleted
&& (
(UserPasswordList.Any(up => up.PasswordId == pass.PasswordId && up.Id == UserId))
|| (userIsAdmin && ApplicationSettings.Default.AdminsHaveAccessToAllPasswords)
|| pass.Creator_Id == UserId
)
) //make sure only undeleted passwords - that the current user has acccess to - are returned
.OrderBy(pass => pass.PasswordOrder)
.ToList(),
CategoryId = c.CategoryId,
CategoryName = c.CategoryName,
Category_ParentID = c.Category_ParentID,
CategoryOrder = c.CategoryOrder,
Parent_Category = c.Parent_Category,
Deleted = c.Deleted
})
.SingleOrDefault();
Если в репозиториях есть только базовые методы, такие как Save, Update, Delete, Insert, FindById и т. Д., Как мне разбить запрос на репозитории? Там также много бизнес-логики, такой как фильтрация паролей, к которым у пользователя есть доступ, где это должно быть?
Я читал кое-что о возврате объектов IQueryable, чтобы запросы LINQ можно было изменять на уровне сервиса ... как это будет выглядеть?