【问题标题】:Unit testing existing codebase对现有代码库进行单元测试
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答 Colin :-) 现在,这很简单,只需尝试将我的 MyContext 切换到正常工作的界面即可。再次感谢!
    • 只是一个关于模拟的后续问题:我已经开始手动创建模拟数据(用引用和属性等编写每个类),现在用 3 小时完成了 28 个表中的 4 个表只需键入虚拟数据。真的是这样吗? :-O 设置正确的引用似乎是一场意大利面噩梦..
    • @BoMortensen 当然,这是一项不平凡的工作。我真的不知道有什么可以加快这个过程的。您可以编写一个工具来从现实世界的测试数据中生成模拟数据,但我认为成本最终会超过收益
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 2011-02-21
    • 2010-12-29
    相关资源
    最近更新 更多