情況
我可能沒有使用傳統意義上的PHPUnit。我在Selenium 2中使用PHPUnit。我們有這個想法來記錄Selenium在「重現步驟」中執行的操作。意思是如果我們調用Selenium來「點擊」或「鍵入」,則記錄動作。如果某個操作失敗,它也會被記錄下來。我們不調用斷言來設置類型的操作。例如,如果我們正在測試一個頁面來查看客戶信息,但在我們甚至可以訪問該頁面之前我們需要登錄,但我們並沒有聲明登錄操作,而只是在必須查看客戶信息。如果監聽器是在phpunit.xml中定義的,是否可以將PHP變量傳遞給PHPUnit的自定義監聽器?
現在,當我們終於做了斷言,我們也想記錄結果。我們創建了一個自定義偵聽器來捕獲結果。我們現在面臨的問題是如何將結果發回給我們的行動記錄器。
我本來跑了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
通過自定義偵聽器傳遞變量?
我們還將定義一個引導來初始化動作記錄器。
如果不是這樣,最好的行動方案是使操作記錄器對象在引導程序中是全局的,並讓自定義的監聽器以這種方式訪問它?
我只做OOP大約一年(主要是PHP),並且我沒有寫任何單例類型的類。如果stepStepTracker()是靜態的,它是否會像調用QA_Listener :: setStepTracker($ stepTracker)一樣直接調用並獲得相同的結果? 在'bootstrap.php'之前,'phpunit.xml'中的自定義監聽器是否真的被處理(實例化或掛鉤了,無論它需要做什麼)?我的引導程序具有'$ QA_STEP_TRACKER =新的QA_StepTracker()'和QA_Listener的結構具有'全局$ QA_STEP_TRACKER'並且能夠按預期處理它。謝謝! – NkM
我只是做了一個快速測試,看起來'phpunit.xml'首先被*處理,然後*執行'bootstrap.php'後創建*監聽器。因此,監聽器的構造函數確實可以依賴'bootstrap.php'中創建的全局變量。 –
我的確如此,謝謝! – NkM