1

前提

我知道编写代码以在运行测试时采取不同的行为是非常糟糕的做法,但我实际上可能遇到过可能需要这样做的场景。

具体来说,我正在尝试在 Zend 框架中测试一个非常具体的 HTML Purifier 包装器——确切地说,是一个 View Helper。HTML Purifier 自动加载器是必要的,因为它使用的逻辑与我们原本拥有的自动加载器不同。

问题

require() - 在我的 View Helper 类顶部使用自动加载器,在 test-scope 中为我提供以下内容:

由于 PHP 错误 #44144,HTML Purifier 自动加载器注册器与非静态对象方法不兼容;请不要使用 HTMLPurifier.autoload.php(或任何包含此文件的文件);相反,将代码: spl_autoload_register(array('HTMLPurifier_Bootstrap', 'autoload')) 放在您自己的自动加载器之后。

用宣传的方式替换require()意味着测试运行良好,但 View Helper 死于可怕的死亡声称:spl_autoload_register(array('HTMLPurifier_Bootstrap', 'autoload'))

Zend_Log[3707]:ErrorController 捕获 LogicException “传递的数组未指定现有的静态方法(未找到类 'HTMLPurifier_Bootstrap')”

(我们的测试文件夹结构必然与 Zend 文件夹结构略有不同。)

问题)

在修补它之后,我想我需要根据事物是否在测试范围内来选择一个自动加载器加载。

  1. 我是否有另一种选择来包含 HTMLPurifier 的自动加载例程,因为我没有看到由于隧道视觉而导致的两种情况?

  2. 如果不是,我是否必须找到一种方法来使用我自己的代码(例如 APPLICATION_ENV)来区分测试环境和生产环境 - 或者 PHPUnit 是否通过设置一个常量来支持我的这个可怕的黑客行为,我可以检查它是否被定义()或类似的恶作剧?(我这里的 Google-fu 很弱!我可能只是做错了。)

4

2 回答 2

3

HTML Purifier 将其自动加载代码放置在与 HTMLPurifier.auto.php 不同的文件中;即 HTMLPurifier_Bootstrap。它有两种方法:autoload,它实际上执行自动加载,以及 getPath,它不包含文件 put 告诉您文件的位置。该文件明确设计为独立的。

不幸的是,我没有资格谈论 Zend 的代码。在尝试代码之前,您可能可以在 Bootstrap 中添加额外的包含。希望有帮助!

于 2010-03-31T15:35:29.710 回答
1

好吧,尽管您对生产和测试环境之间的相似性(如果不是同一性)要求是正确的-我的配置仍然有些不同。我的意思是引导从 application.ini 加载不同的部分,因此我可以简单地传递标志来打开/关闭某事(如自动加载功能):

1)我的 .htaccess 中有 SetEnv APPLICATION_ENV 测试(可能是生产、开发、登台)。您也可以在 apache 配置中使用它。2) Zend_Config 加载 application.ini 时 - 它根据 get_env('APPLICATION_ENV') 加载它 - 所以不同场景的不同部分(我实际上当然依赖 Zend_Application,但它足够聪明,可以理解环境) 3)我可以总是在相应的部分添加一些标志并从代码中检查它。

希望这有所帮助。

于 2010-03-31T11:07:51.253 回答