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

标签 php phpunit

情况

我可能没有使用传统意义上的 PHPUnit。我正在使用带有 Selenium 2 的 PHPUnit。我们有这个想法来记录 Selenium 以“重现步骤”的方式执行的操作。这意味着如果我们调用 Selenium 来“单击”或“键入”,则会记录该操作。如果操作失败,它也会被记录下来。我们不会调用断言来设置类型的操作。例如,如果我们正在测试一个查看客户信息的页面,但在我们到达那个页面之前我们需要登录,我们不会断言登录操作,但只在我们必须查看客户信息。

现在当我们最后做一个断言的时候,我们也想记录下结果。我们创建了一个自定义监听器来捕获结果。我们现在遇到的问题是如何将结果发送回我们的 Action 记录器。

我最初是这样运行 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() 传入 Action 记录器对象

问题

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

我们还将定义一个 Bootstrap 来初始化 Action 记录器。

如果不是,最好的做法是让 Action 记录器对象在 Bootstrap 中成为全局对象,并让自定义监听器以这种方式访问​​它吗?

最佳答案

由于 phpunit.xmlbootstrap.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 在创建监听器之前执行。

关于php - 如果 Listener 是在 phpunit.xml 中定义的,是否可以将 PHP 变量传递到 PHPUnit 的自定义 Listener 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8975689/

相关文章:

php - 如何从 PHPUnit 测试用例中登录?

PHPUnit - PHP fatal error : Call to a member function GetOne() on null

php - 来自数据库的类别树。仅可点击 cat_parent_id> 0

javascript - session 超时 - 结果以分钟为单位

php - @runInSeparateProcess 时反序列化错误

php - header 已在 PHPStorm 中发送运行单元测试

php - 如何在 Symfony 4 和 Simple-PHPUnit 中调试测试?

php 更快地从 url 中获取宽度和高度 >=200 的所有图像

php - 在 ACF 的 matchCallback 中读取 Action 参数

php - UTF8数据库查询及特殊字符