Написах уеб приложение на 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();
Ако хранилищата имат само основни методи като Запазване, Актуализиране, Изтриване, Вмъкване, FindById и т.н.... как трябва да разбия заявката в хранилищата? Там също има много бизнес логика, като филтриране на пароли, до които потребителят има достъп, къде трябва да се намира?
Прочетох нещо за връщане на IQueryable обекти, така че LINQ заявките да могат да се променят в слоя на услугата... как ще изглежда това?