代码之家  ›  专栏  ›  技术社区  ›  pinkgothic sudip

phpunit和autoloaders:确定代码是否在测试范围内运行?

  •  1
  • pinkgothic sudip  · 技术社区  · 15 年前

    前提

    我知道在运行测试时编写代码以采取不同的行为是非常糟糕的做法,但我可能实际上遇到了这样一种情况,在这种情况下可能是必要的。

    具体来说,我试图在zend框架中测试一个非常特定的html净化器包装器——确切地说,是一个视图助手。HTML净化器自动加载器是必要的,因为它使用了不同的逻辑,我们的自动加载器,否则。

    问题

    要求() -在我的视图助手类的顶部调用autoloader,可以得到以下结果 在测试范围内 :

    HTML净化器自动加载器注册器不兼容 由于php错误而使用非静态对象方法44144; 请不要使用htmlpurifier.autoload.php(或任何 包含此文件的文件);而是放置代码: spl_autoload_register(数组('htmlpurifier_bootstrap','autoload')) 在你自己的自动装弹机之后。

    更换 小精灵 具有 spl_autoload_register(array('HTMLPurifier_Bootstrap', 'autoload')) 正如广告中所说,测试运行良好,但是视图助手死于非命,声称:

    zend_log[3707]:errorcontroller捕捉到逻辑异常“传递的数组未指定现有静态方法(未找到类'htmlpurifier_bootstrap'”

    (根据需要,我们的测试文件夹结构与zend文件夹结构略有不同。)

    问题(s)

    在修改之后,我想我需要选择一个自动加载程序,这取决于东西是否在测试范围内。

    1. 在这两种情况下,我是否有其他选项包括htmlpurifier的自动加载例程,而这两种情况都是由于隧道视觉而无法看到的?

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

    2 回复  |  直到 12 年前
        1
  •  3
  •   Edward Z. Yang    15 年前

    HTML净化器将其自动加载代码放在一个不同于html purifier.auto.php的文件中,即htmlpurifier_bootstrap。它有两种方法:autoload,它实际上执行自动加载;getpath,它不包含一个文件put,它告诉您文件在哪里。这个文件被明确地设计成独立的。

    不幸的是,我没有资格谈论Zend的代码。在尝试代码之前,您可能只需执行额外的include to bootstrap就可以了。希望能有帮助!

        2
  •  1
  •   Victor Farazdagi    15 年前

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

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

    希望这有点帮助。