如果在phpunit.xml中定义了Listener,是否可以将PHP变量传递给PHPUnit的自定义Listener?

时间:2012-01-23 17:13:54

标签: php phpunit

情况

我可能没有使用传统意义上的PHPUnit。我正在使用PHPUnit和Selenium 2.我们有这个想法来记录Selenium正在以“重现步骤”的方式执行的操作。这意味着如果我们将Selenium称为“click”或“type”,则会记录该操作。如果操作失败,也会记录。我们不会将断言称为设置类型操作。例如,如果我们正在测试页面以查看客户信息,但在我们甚至可以访问该页面之前我们需要登录,我们不会断言登录操作,但只在我们必须查看时才断言最后一部分客户信息。

现在,当我们最终做一个断言时,我们也想记录结果。我们创建了一个自定义侦听器来捕获结果。我们现在遇到的问题是如何将结果发送回我们的动作录音机。

我最初是这样运行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通过自定义侦听器传递变量?

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

如果没有,最好的行动方案是否会使动作记录器对象在引导程序中全局化并让自定义侦听器以这种方式访问​​它?

1 个答案:

答案 0 :(得分:1)

由于在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