【发布时间】:2011-10-07 20:34:51
【问题描述】:
我正在开发一个包含大量 PHP 代码库的新项目。该应用程序使用了相当多的 PHP 常量 (define('FOO', 'bar')),特别是对于数据库连接参数之类的东西。这些常量都定义在一个单独的配置文件中,该文件基本上由应用程序中的每个类直接require_once()'d。
几年前这很合理,但从那时起我就遇到了单元测试错误,并且类之间的这种紧密耦合真的让我很困扰。这些常量闻起来像全局变量,并且在整个应用程序代码中直接引用。
这仍然是个好主意吗?将这些值复制到一个对象中并使用该对象(即一个 Bean - 我说过)通过依赖注入将它们传递给与数据库交互的类是否合理?我这样做是否会破坏 PHP 常量的任何好处(比如速度或其他东西)?
我正在考虑的另一种方法是创建一个单独的配置 PHP 脚本进行测试。我仍然需要想办法让被测类使用沙盒配置脚本而不是全局配置脚本。这仍然感觉很脆弱,但它可能需要对整个应用程序进行较少的彻底修改。
【问题讨论】:
-
#define CONSTANTS 'are fine'? -
@Marc B:太爱了!
-
这些常量是/曾经是(超级)全局变量,只能设置一次。这就是为什么它们被用于配置 - 不是出于测试原因,而是(因为没有进行测试)以确保它们不会被其余的热翘起和奶酪支持的意大利面条代码更改 - 只是为了确保代码的任何部分都没有... ;) - 所以为工作选择合适的工具。逐步测试遗留代码是一门艺术。删除常量可能是其中的一部分。
-
这类问题的答案是意见或讨论,不适合 Stack Overflow。根据faq,您应该只根据您面临的实际问题提出实用、可回答的问题。“不具建设性”的最接近的原因列出了诸如 这个问题可能会征求意见的原因意见、辩论、争论、投票或扩展讨论。因此,我将其关闭为“不具建设性”。
-
好的,我敲定了 3 票重新打开它。我并不是说关闭它是/错误的,但社区已经发声了。
标签: php unit-testing dependency-injection tdd