【发布时间】:2009-12-04 16:53:50
【问题描述】:
我们刚刚为我们的专有系统发布了一个重新编写的(第三次)模块。这个模块,我们称之为负载管理器,是迄今为止我们系统中所有模块中最复杂的。我们正在尝试获得一个全面的测试套件,因为每次我们对该模块进行任何重大更改时,都会花费数周时间来整理错误和怪癖。然而,事实证明,开发测试套件相当困难,因此我们正在寻找想法。
负载管理器的核心位于一个名为 LoadManagerHandler 的类中,这基本上是模块背后的所有逻辑。此处理程序调用多个控制器在数据库中执行 CRUD 方法。这些控制器本质上是 DAL 的顶层,位于顶层并抽象出我们的 LLBLGen 生成的代码。
因此,我们使用 Moq 框架来模拟这些控制器很容易。然而问题在于负载管理器的复杂性,我们收到的问题不是处理简单的情况,而是处理程序中包含大量数据的情况。
为了简要说明负载管理器包含许多“卸载”的详细信息,有时有数百个,然后将其放入用户创建的负载和重新发送池中。在创建和填充这些负载的过程中,存在大量删除、更改和添加,最终导致出现问题。但是,因为当您模拟对象的方法时,最后一个模拟获胜,即:
jobDetailControllerMock.Setup(mock => mock.GetById(1)).Returns(jobDetail1);
jobDetailControllerMock.Setup(mock => mock.GetById(2)).Returns(jobDetail2);
jobDetailControllerMock.Setup(mock => mock.GetById(3)).Returns(jobDetail3);
无论我向 jobDetailController.GetById(x) 发送什么,我都会返回 jobDetail3。这使得测试几乎不可能,因为我们必须确保在进行更改时,所有应该受到影响的点都会受到影响。
所以,我决定使用测试数据库,只允许读取和写入正常进行。但是,因为您不能(阅读:不应该)规定测试的顺序,所以较早运行的测试可能会导致稍后运行的测试失败。
TL/DR:我本质上是在为本质上相当复杂的面向数据的代码寻找测试策略。
【问题讨论】:
标签: c# unit-testing tdd mocking moq