如果侦听器是在PHPUnit.xml中定义的,是否可以将PHP变量传递到PHPUnit的自定义侦听器中? 处境
我可能没有使用传统意义上的PHPUnit。我正在使用PHPUnit和Selenium 2。我们的想法是记录Selenium以“复制步骤”的方式执行的操作。这意味着,如果我们调用Selenium来“单击”或“键入”,则会记录该操作。如果操作失败,也会记录该操作。我们不调用断言来设置类型操作。例如,如果我们正在测试一个页面以查看客户信息,但在我们进入该页面之前,我们需要登录,我们不会断言登录操作,而只在必须查看客户信息时断言最后一部分 现在,当我们最终执行断言时,我们还希望记录结果。我们创建了一个自定义侦听器来捕获结果。我们现在面临的问题是如何将结果发送回动作记录器 我最初是这样运行PHPUnit测试的:如果侦听器是在PHPUnit.xml中定义的,是否可以将PHP变量传递到PHPUnit的自定义侦听器中? 处境,php,phpunit,Php,Phpunit,我可能没有使用传统意义上的PHPUnit。我正在使用PHPUnit和Selenium 2。我们的想法是记录Selenium以“复制步骤”的方式执行的操作。这意味着,如果我们调用Selenium来“单击”或“键入”,则会记录该操作。如果操作失败,也会记录该操作。我们不调用断言来设置类型操作。例如,如果我们正在测试一个页面以查看客户信息,但在我们进入该页面之前,我们需要登录,我们不会断言登录操作,而只在必须查看客户信息时断言最后一部分 现在,当我们最终执行断言时,我们还希望记录结果。我们创建了一个自
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
config文件来定义自定义侦听器
查看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>
根据示例,看起来我可以传入一个对象。。。但它将是一个新实例化的对象,而不是预先存在的对象
此外,如果使用上面的示例,我们将在客户侦听器中去掉setStepTracker()
,并通过客户侦听器的\uu构造()传入action recorder对象
问题:
是否可以通过phpunit.xml
通过自定义侦听器传入变量
我们还将定义一个引导来初始化动作记录器
如果不是,那么最好的操作过程是否会使action recorder对象在引导中成为全局对象,并让自定义侦听器以这种方式访问它?由于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
的问题。我只做了大约一年的OOP(主要是php),还没有编写任何单例类型的类。如果stepStepTracker()是静态的,那么它是否会像QA_Listener::setStepTracker($stepTracker)那样直接调用它并得到相同的结果?在bootstrap.php
之前,phpunit.xml
中的自定义侦听器是否真的被处理过(实例化或挂接,无论需要做什么)?我的引导程序有$QA\u STEP\u TRACKER=新的QA\u StepTracker()
,而QA\u侦听器的构造有全局$QA\u STEP\u TRACKER
,并且能够按预期处理它。谢谢我刚刚做了一个快速测试,结果显示,虽然先处理phpunit.xml
,但监听器是在执行bootstrap.php
后创建的。因此,侦听器的构造函数实际上可以依赖于在bootstrap.php
中创建的全局变量。
// bootstrap.php
$stepTracker = new QA_StepTracker();
// listener
class QA_Listener implements PHPUnit_Framework_TestListener
{
public function __construct() {
global $stepTracker;
$this->stepTracker = $stepTracker;
...
}
}