Мне трудно протестировать EntityFramework 4. Я использую его с использованием подхода, основанного на базе данных, слишком поздно, чтобы перейти к poco. Нужно доставлять довольно быстро, нет времени на то, чтобы научиться как обычно.
Я реализовал шаблон репозитория с единицей работы, но мне трудно внедрить репозиторий в мой уровень Service, чтобы я мог тестировать поведение службы бизнес-уровня, проверки и т. Д., Не обращаясь к базе данных.
но я сталкиваюсь со многими небольшими проблемами.
Чтобы внедрить репозиторий в службу (конструктор), вызывающему уровню необходимо иметь ссылку на DAL (объекты EF). Я не хочу этого
Если у меня много репозиториев, например, CustomerRepository, EmployeeRepository, то мне нужно столько конструкторов, сколько репозиториев, чтобы я мог внедрить репозиторий.
3. Не уверен, куда идти отсюда. Я не нашел ни одного примера в сети, где они вводят репозиторий в сервис, используя EF4. Все примеры, которые я видел, издеваются над хранилищем сами по себе, что нехорошо для меня.
Мне нужно протестировать свой сервисный уровень / BizLayer, не обращаясь к базе данных.
Все это просто не поддается тестированию и добавляет так много зависимостей и проблем.
Прикольный пример, который я собрал
public class DepartmentServiceLibrary
{
private readonly IDepartmentRepository _departmentRepository;
public DepartmentServiceLibrary(IDepartmentRepository departmentRepository)
{
_departmentRepository = departmentRepository;
}
public List<DepartmentDto> GetDepartments()
{
return DeparmentBiz.GetDepartments();
}
private DeparmentBL _departmentBiz;
private DeparmentBL DeparmentBiz
{
get
{
return _departmentBiz ?? new DeparmentBL(_departmentRepository);
}
}
}
// внутренний класс
internal class DeparmentBL
{
private readonly IDepartmentRepository _departmentRepository;
public DeparmentBL(IDepartmentRepository departmentRepository)
{
_departmentRepository = departmentRepository;
}
public List<DepartmentDto> GetDepartments()
{
using (var ctx = new AdventureWorksContext())
{
var uow = new UnitOfWork(ctx);
_departmentRepository.UnitOfWork = uow;
var query = _departmentRepository.GetAll();
return query.Select(dpt => new DepartmentDto
{
DepartmentId = dpt.DepartmentID,
Name = dpt.Name,
GroupName = dpt.GroupName
}).ToList();
}
}
}
Следующий TestMethod требует, чтобы я добавил в dal ссылку, которая побеждает точку
[TestMethod]
public void Should_be_able_to_call_get_departments()
{
var mock = new Mock<IDepartmentRepository>();
var expectedResult = new List<Department>(); //Dependency to DAL as Department is a EF Entity generated by EF.
mock.Setup(x => x.GetAll()).Returns(expectedResult);
var companyService = new MyCompanyBL(mock.Object); //InternalVisibileTO
var departments = companyService.GetAll();
//assert removed for brevity
Есть предложения или примеры, показывающие, как это сделать?
спасибо
}