3

我有这样的方法:

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 进行查询。

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

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

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

谢谢

4

3 回答 3

2

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

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

然后使用 RhinoMock、Moq 验证是否调用了 Get() 和 RemoveCase()。

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

于 2013-01-21T21:43:43.887 回答
1

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

  1. 通过预设(Rails 中的固定装置)初始化数据库表内容
  2. 开启交易
  3. 运行测试
  4. 回滚事务
  5. 转到第 2 点。进行另一个测试
于 2013-01-21T21:38:51.593 回答
1

“知路与行路”是有区别的。您要测试的内容将归类为集成测试而不是单元测试。单元测试是在没有任何外部依赖的情况下独立执行的,因此即使您正在运行它的机器上没有物理数据库实例,它也可以使测试运行。在此处查看更多差异。

这就是为什么像 Repository 这样的模式在做基于持久性的应用程序时非常受欢迎,因为它们通过 Mocking 提高了数据层的单元测试能力。在此处查看示例。

因此,您有 2 个选项(蓝色药丸或红色药丸):

Blue Pill:购买TypeMock Isolator essentialJustMock 之类的工具,您将能够模拟代码中的任何内容,“然后故事就结束了”。

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

祝一切顺利。

于 2013-01-21T22:29:28.847 回答