单元测试数据库修改功能

本文关键字:功能 修改 数据库 单元测试 | 更新日期: 2023-09-27 17:54:51

我有这样的方法:

public static bool ChangeCaseEstimatedHours(int caseID, decimal? time)
   {
       Case c = Cases.Get(caseID);
       if (c != null)
       {
           c.EstimatedHours = time;
           return Cases.Update(c);
       }
       return false;
   }
   public static bool RemoveCase(int caseID)
   {
       return Cases.Remove(caseID);
   }

在内部使用LINQ执行查询。

我想知道我应该如何去测试这些。它们没有状态,所以是静态的。他们还修改数据库。

因此,我必须创建一个案例,然后在同一个测试中删除它,但是单元测试应该只做一件事。在这种情况下通常会做什么?

如何测试数据库查询、更新和删除?

谢谢

单元测试数据库修改功能

需要访问数据库的测试可能是最难维护的测试。如果您可以避免在单元测试中触及数据库,我将尝试为Cases类创建一个接口。

interface ICase
    {
        ICase Get(int caseID);
        bool RemoveCase(int caseID);
    }

然后使用RhinoMock, Moq来验证Get()和RemoveCase()是否被调用。

如果您坚持需要使用数据库进行测试,那么您将需要花时间设置测试数据库并进行适当的数据清理。

知道路和走路是有区别的。你想要测试的是集成测试,而不是单元测试。单元测试是在没有任何外部依赖的情况下独立执行的,因此即使在没有物理数据库实例的机器上运行测试,也可以运行测试。点击这里查看更多不同之处。

这就是为什么像Repository这样的模式在基于持久性的应用程序中非常流行的原因,因为它们通过mock提高了数据层的单元测试能力。在这里查看示例。

所以,你有两个选择(蓝色药丸或红色药丸):

Blue Pill:购买一个像TypeMock Isolator essential或JustMock这样的工具,你就可以模拟代码中的任何东西,"故事就结束了"。

Red Pill:将现有的数据层设计重构为基于接口的模式之一,并使用免费的mock框架,如Moq或RhinoMocks,"看看兔子洞有多深"

祝你一切顺利。

也许你可以考虑基于Rails框架的方法:

  1. 通过预设(Rails中的fixture)初始化数据库表内容
  2. 打开事务
  3. 运行测试
  4. 回滚事务
  5. 转到点2。与另一个测试