如果监听器是在PHPUnit.xml中定义的,那么是否可以将PHP变量传递到PHPUnit的自定义监听器中



情况

我可能没有使用传统意义上的PHPUnit。我正在使用PHPUnit和Selenium 2。我们有这个想法来记录Selenium以"复制步骤"的方式执行的操作。这意味着,如果我们调用Selenium来"点击"或"键入",那么操作就会被记录下来。如果操作失败,也会记录下来。我们不是在调用断言来设置类型的操作。例如,如果我们正在测试一个页面来查看客户信息,但在我们到达需要登录的页面之前,我们不会断言登录操作,而是只在必须查看客户信息时断言最后一部分。

现在,当我们最终进行断言时,我们还想记录结果。我们创建了一个自定义侦听器来捕获结果。我们现在面临的问题是如何将结果发送回我们的行动记录仪。

我最初运行的PHPUnit测试是这样的:

class SandboxTest extends PHPUnit_Framework_TestCase { /* tests */ }
$stepTracker = new QA_StepTracker(); // Our custom action recorder
$suite = new PHPUnit_Framework_TestSuite();
$listener = new QA_Listener(); // Our customer listener
$listener->setStepTracker($stepTracker); // Passing the action recorder object to our customer listener
$result = new PHPUnit_Framework_TestResult();    
$suite->addTestSuite('SandboxTest');
$result->addListener($listener);
$suite->run($result);

这正如我所期望的那样工作,尽管这样运行感觉像是在失去phpunit命令所提供的许多功能。我想回到使用phpunit命令,并使用phpunit.xml配置文件来定义自定义侦听器。

通过查看PHPUnit文档,我注意到在phpunit.xml中定义客户侦听器时可以传递参数。

<listeners>
  <listener class="MyListener" file="/optional/path/to/MyListener.php">
    <arguments>
      <array>
        <element key="0">
          <string>Sebastian</string>
        </element>
      </array>
      <integer>22</integer>
      <string>April</string>
      <double>19.78</double>
      <null/>
      <object class="stdClass"/>
    </arguments>
  </listener>
</listeners>

相当于

$listener = new MyListener(
  array('Sebastian'),
  22,
  'April',
  19.78,
  NULL,
  new stdClass
);

根据这个例子,看起来我可以通过一个物体。。。但它将是一个新实例化的对象,而不是预先存在的对象。

此外,如果我们使用上面的示例,我们将在客户侦听器中去掉setStepTracker(),并通过客户侦听器的__construct() 传入动作记录器对象

问题

是否可以通过phpunit.xml通过自定义侦听器传入变量?

我们还将定义一个引导程序来初始化动作记录器。

如果不是,那么最好的操作方案是在引导程序中使动作记录器对象全局化,并让自定义侦听器以这种方式访问它吗?

由于phpunit.xml是在bootstrap.php之前处理的,但侦听器是在之后创建的,因此可以在侦听器的构造函数中使用全局变量。

// bootstrap.php
$stepTracker = new QA_StepTracker();
// listener
class QA_Listener implements PHPUnit_Framework_TestListener
{
    public function __construct() {
        global $stepTracker;
        $this->stepTracker = $stepTracker;
        ...
    }
}

更新:修复了在创建侦听器之前执行bootstrap.php的问题。

最新更新