我知道编写代码以便在运行测试时采取不同的行为是非常糟糕的做法,但我可能实际上遇到过可能需要的情况。
具体来说,我正试图在Zend框架中测试HTML Purifier的一个非常具体的包装器 - 确切地说是一个View Helper。 HTML Purifier自动加载器是必要的,因为它使用了与我们原本拥有的自动加载器不同的逻辑。
require() - 我的View Helper类顶部的自动加载器,在测试范围中提供以下:
HTML Purifier自动加载器注册器不兼容 由于PHP Bug#44144的非静态对象方法; 请不要使用HTMLPurifier.autoload.php(或任何 包含此文件的文件);相反,放置代码: spl_autoload_register(array('HTMLPurifier_Bootstrap','autoload')) 在你自己的自动加载器之后。
将 require()替换为宣传的spl_autoload_register(array('HTMLPurifier_Bootstrap', 'autoload'))
意味着测试运行良好,但View Helper死于可怕的死亡声明:
Zend_Log [3707]:ErrorController捕获到LogicException“传递的数组未指定现有的静态方法(未找到类'HTMLPurifier_Bootstrap')”
(我们的测试文件夹结构与我们的Zend文件夹结构略有不同。)
在修补它之后,我想我需要选择一个自动加载器加载,具体取决于是否在测试范围内。
我是否有另一种方法可以在两种情况下都包含HTMLPurifier的自动加载例程,因为我没有看到隧道视觉?
如果没有,我是否必须找到一种方法来区分测试环境和生产环境这与我自己的代码(例如APPLICATION_ENV) - 或者PHPUnit是否通过设置常量来支持我本地的这种神奇的hackery我可以检查它是定义(),还是类似的恶作剧? (我的谷歌在这里很弱!我可能只是做错了。)
答案 0 :(得分:3)
HTML Purifier将其自动加载代码放在与HTMLPurifier.auto.php不同的文件中;即HTMLPurifier_Bootstrap。它有两种方法:autoload,它实际上执行自动加载,以及getPath,它不包含文件put告诉你文件的位置。此文件明确设计为独立。
不幸的是,我没有资格谈论Zend的代码。在尝试代码之前,您可能只需要在Bootstrap中执行额外的包含即可。希望有所帮助!
答案 1 :(得分:1)
嗯,虽然你对生产和测试环境之间的相似性(如果不是身份)要求是对的 - 我的配置仍然有些不同。我的意思是bootstrapping从application.ini加载不同的部分,因此我可以简单地通过标志打开/关闭(就像那个自动加载器功能):
1)我的.htaccess中有SetEnv APPLICATION_ENV测试(可能是生产,开发,升级)。您也可以在apache配置中使用它。 2)当Zend_Config加载application.ini时 - 它根据get_env('APPLICATION_ENV')加载它 - 所以不同场景的不同部分(当然我实际上依赖于Zend_Application,但它很聪明地理解环境) 3)我总是可以在相应的部分添加一些标志,并从代码中检查它。
希望这有点帮助。