我们刚刚发布了一个为我们专有系统重写的模块(第三次)。这个模块,我们称之为负载管理器,迄今为止是迄今为止我们系统中所有模块中最复杂的。我们试图获得一个全面的测试套件,因为每当我们对这个模块做出任何重大改变时,都会花费数周时间来解决错误和怪癖。然而,开发一个测试套件已经证明是相当困难的,所以我们正在寻找想法。需要TDD方法的想法
负载管理器的内存驻留在一个名为LoadManagerHandler的类中,这实质上是模块背后的所有逻辑。该处理程序调用多个控制器在数据库中执行CRUD方法。这些控制器实际上是位于顶部的DAL的顶层,并将我们的LLBLGen生成的代码抽象出来。
所以很容易模拟这些控制器,我们正在使用Moq框架。然而问题出在Load Manager的复杂性上,我们收到的问题并不是处理简单的案例,而是处理器中包含大量数据的情况。
简要解释负载管理器包含一些“卸载”细节,有时数百个,然后放入用户创建的负载和reship池中。在创建和填充这些负载的过程中,会有大量的删除,更改和添加,最终导致问题出现。然而,因为当你嘲笑对象的方法,最后模拟胜,即:
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:我本质上是在寻找面向数据的代码的测试策略,这种代码本质上是非常复杂的。
我提高了你的答案,因为我不知道这是可能的,但我不相信这将完全达到我期待的结果。我需要根据所使用的参数返回特定的数据,并且此方法不一定会按预定顺序调用。不过非常感谢,这会帮助我在其他地方。 – joshlrogers 2009-12-04 17:23:39
好的....有什么想法,为什么这不适合我呢?我正在使用Moq的最新版本,无论我传入什么参数,我都会收到最后的模拟返回结果。 – joshlrogers 2009-12-04 17:30:16
@josh - 不知道。我使用v3.1.416.3进行了测试,该版本是该网站的最新非beta版本。这是标准行为,这就是为什么必要时引入It.IsAny语法来覆盖它的原因。我建议你用控制器编写最简单的测试,看看你能否消除变量。您也可以发表Moq讨论 - 他们非常有帮助。 http://groups.google.com/group/moqdisc – TrueWill 2009-12-04 17:36:43