我正在处理具有大量业务逻辑代码的中型(ASP.NET MVC)项目,因为应用程序的业务规则有时非常复杂。
我使用以下解决方案结构:
为了访问(MSSQL)数据库,我使用了Entity Framework v.6。
现在,大多数业务逻辑方法已经编写并正常工作。但是,代码库的大小现在已经到了一定程度,我正在修复一个功能,然后打破另一个很不理想的功能。从一开始我应该做的就是为业务逻辑方法编写单元测试,采用TDD方法。
由于这个原因,我想尝试为现有(以及将来)的业务逻辑方法引入单元测试,我已经阅读了Moq并发现了this blog post on MSDN,我觉得这很有趣。但是存在一个问题:我的DbContext被注入业务逻辑类(我每个http请求运行一个 DbContext),用于执行CRUD操作。业务逻辑类可能如下所示:
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用于我的业务逻辑类,因为它需要一种类型的MyContext
。有没有办法可以使用我现有的方法,但是使用伪上下文呢?
此外,这是一个相当大的数据库,有20 - 25个表。我是否必须手动为每个表创建模拟数据,对于我运行的每个测试,或者是否有其他方式&#34; mock&#34;它?一些测试将涉及7个不同的表格,这些表格提供了大量的手动模拟数据: - )
非常感谢任何帮助/提示。
提前致谢。
答案 0 :(得分:2)
不是传递MyContext
,而是为您的上下文类创建一个IMyContext
接口,然后传递它。然后,您可以模拟您对Context类的期望。
至于模拟数据,20-25个表并不是一个大型模式。您可以构建共享模拟数据库,并根据测试需要对其进行操作。