【问题标题】:PHPUnit and autoloaders: Determining whether code is running in test-scope?PHPUnit 和自动加载器:确定代码是否在测试范围内运行?
【发布时间】:2010-03-31 10:26:48
【问题描述】:

前提

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

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

问题

require()-在我的 View Helper 类顶部使用自动加载器,在测试范围内为我提供了以下内容:

HTML Purifier 自动加载器注册器不兼容 由于 PHP 错误 #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 文件夹结构略有不同。)

问题

在修改之后,我想我需要根据测试范围内的东西是否选择自动加载器加载。

  1. 在两种情况下,我是否有另一个选项来包含 HTMLPurifier 的自动加载例程,但由于隧道视野而我没有看到?

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

【问题讨论】:

    标签: php zend-framework phpunit autoload htmlpurifier


    【解决方案1】:

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

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

    【讨论】:

    • 天哪。我真的是那么浓密。谢谢,(= 在 spl 调用之前手动包括 Bootstrap)在两种环境中都修复了它!
    【解决方案2】:

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

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

    希望这会有所帮助。

    【讨论】:

    • 我知道我可以用自己的代码解决这个问题,例如你描述的方式 - 我要问的是我是否必须这样做,或者 PHPUnit 是否在内部带有标志。尽管我想您可能会认为 APPLICATION_ENV 很重要,即使严格来说,这是外部的。 [仅供参考,我会尽快投票(目前以我的每日上限)。]
    猜你喜欢
    • 2012-05-02
    • 2019-07-09
    • 1970-01-01
    • 2015-05-20
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 2010-10-26
    相关资源
    最近更新 更多