【发布时间】:2016-02-02 23:04:24
【问题描述】:
我正在开发一个包含大量业务逻辑代码的中型 (ASP.NET MVC) 项目,因为应用程序的业务规则有时非常复杂。
我正在使用以下解决方案结构:
- ClientName.Web(MVC 网站)
- ClientName.Interfaces(定义业务逻辑方法)
- ClientName.BusinessLogic(应该称为“服务”,因为我在这里使用实体框架)
- ClientName.Model(包含 EF DbContext 类、枚举等)
- ClientName.Tests(单元测试项目)
为了访问 (MSSQL) 数据库,我使用的是 Entity Framework v. 6。
现在,大多数业务逻辑方法都已编写好并可以正常工作。但是,代码库的大小现在处于某个点,我正在修复一个功能,然后破坏另一个远非理想的功能。我应该从一开始就为业务逻辑方法编写单元测试,采用 TDD 方法。
因此,我想尝试为现有(和未来的)业务逻辑方法引入单元测试,我已经阅读了Moq 并发现了我发现有趣的this blog post on MSDN。但是有一个问题:我的 DbContext 被注入到用于执行 CRUD 操作的业务逻辑类中(我为每个 http 请求运行 one DbContext)。业务逻辑类可能如下所示:
public class PersonBusiness
{
private readonly MyContext _myContext;
public PersonBusiness(MyContext myContext)
{
_myContext = myContext;
}
public IEnumerable<PersonResponsibility> GetResponsibilities()
{
return _myContext.PersonResponsibilities.Where(x => x.IsActive).ToList();
}
public void CreatePerson(string name)
{
Person person = new Person() { Name = name };
_myContext.People.Add(person);
_myContext.SaveChanges();
}
}
(这只是一个非常简单的例子,一些 BL 方法对于读取 N 个表等来说是荒谬的复杂)
据我所知,我需要一个假 DbContext 来测试 Moq 可以帮助我,但我没有得到的是我如何将假 DbContext 与我的业务逻辑类一起使用,因为它需要一种 @987654324 @。有没有一种方法可以让我使用我现有的方法,但使用虚假的上下文?
此外,这是一个相当大的数据库,有 20 到 25 个表。我是否必须为每个表、我运行的每个测试手动创建模拟数据,还是有其他方式“模拟”它?一些测试将涉及即 7 个不同的表,这会产生大量手动模拟数据:-)
非常感谢任何帮助/提示。
提前致谢。
【问题讨论】:
标签: c# .net entity-framework unit-testing