单元测试数据库修改功能
本文关键字:功能 修改 数据库 单元测试 | 更新日期: 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框架的方法:
- 通过预设(Rails中的fixture)初始化数据库表内容
- 打开事务
- 运行测试
- 回滚事务
- 转到点2。与另一个测试