单元测试现有代码库

时间:2015-11-02 22:29:04

标签: c# .net entity-framework unit-testing

我正在处理具有大量业务逻辑代码的中型(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被注入业务逻辑类(我每个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个不同的表格,这些表格提供了大量的手动模拟数据: - )

非常感谢任何帮助/提示。

提前致谢。

1 个答案:

答案 0 :(得分:2)

不是传递MyContext,而是为您的上下文类创建一个IMyContext接口,然后传递它。然后,您可以模拟您对Context类的期望。

至于模拟数据,20-25个表并不是一个大型模式。您可以构建共享模拟数据库,并根据测试需要对其进行操作。