2

我正在为我公司的软件产品设计一个新架构。我对单元测试相当陌生。我读了一些关于使用单例和静态方法的恐怖故事,但我并不清楚使用它们的问题,希望能得到一些启发。

这是我正在做的事情:

我有一个多层架构。在服务器端,我使用一系列可重用的对象来表示数据库表,称为“处理程序”。这些处理程序使用其他对象,如 XMLObjects、XMLTables、不同的数据结构等。其中大部分是自制的,而不是您预先打包的对象。无论如何,在这一层之上是一个伪单层。这样做的主要目的是简化更高级别的服务器端代码并​​创建无缝的类管理。我可以说:

$tablehandler = databasename::Handler('tablename') 

...得到一张桌子。我没有看到这个固有的问题。我正在使用一堆处理程序(一个关联数组)来包含不同对象的实例。我没有使用全局变量,所有静态数据成员都是受保护的或私有的。我的问题是这如何导致单元测试出现问题。我不是在寻找时髦的修辞,我在寻找因果关系。我也将不胜感激对此的任何其他见解。在这一点上,我觉得它是一个非常灵活和高效的架构。这里的任何帮助都会很棒。

4

1 回答 1

4

使用静态方法来提供对托管实例的访问——无论它们是单例、池对象还是动态实例——只要您为测试提供一种注入它们自己的模拟的方法,对测试来说都不是问题和存根,并在完成后将其删除。根据您的描述,我没有看到任何会阻止该能力的东西。仅由您在必要时构建它。

如果您有一个类对无需扩展点或通过实例完成工作的方法进行静态调用,您将遇到困难。例如,像这样的调用

UserTable::findByEmail($email);

使测试变得困难,因为您无法插入模拟的、仅内存的表等。但是,将其更改为

UserTable::get()->findByEmail($email);

解决了这个问题,因为测试可以调用UserTable::set($mock)设置代码。有关更详细的示例,请参阅此答案

于 2012-10-04T04:29:52.273 回答