【发布时间】:2018-12-31 21:14:31
【问题描述】:
我发现很难测试 EntityFramework 4。我使用的是数据库优先方法,现在转移到 poco 为时已晚。需要快速交付,没有时间像往常一样正确学习。
我已经使用工作单元实现了存储库模式,但是我发现很难将存储库注入到我的服务层中,以便我可以测试我的业务层服务的行为、验证等......而无需访问数据库。 但是我遇到了很多小问题。
为了将存储库注入服务(构造函数),调用层需要引用 DAL(EF 实体)。我不要这个
-
如果我有很多存储库 EG 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
有什么建议或例子可以说明如何做到这一点吗? 谢谢
}
【问题讨论】:
标签: entity-framework-4 moq repository-pattern