2013-01-23 38 views
3

我正在測試產品搜索表單。產品可以通過不同的參數(如狀態,材料,懷特等)進行搜索。當我想按狀態搜索時,我執行以下操作:如何迭代behat /水貂中的所有<select>字段選項

Scenario Outline: search by status 
    When I select "<status>" from "search_form_status" 
    And I press "Search" 
    And I wait for 3 seconds      // implemented 
    And I follow random link from test result table // implemented 
    Then I should see "<status>" in the "div#status" element 
Examples: 
    |status | 
    |enabled | 
    |disabled| 

而且一切都很好。但是,如果我想測試相同的搜索說法,productMaterial我卡住了,因爲產品材料是可隨時更改的主題(我們可能需要新材料,可能會編輯材料名稱或刪除舊的未使用材料)。此外,測試環境和生產現場的材料也會有所不同。 我知道我可以這樣做:

Given I select product material 

和實施步驟與foreach循環是這樣的:

$matList = $this->getSession()->getPage()->findAll('css', "select option"); 
    foreach($matList as $material){ 
     // DO SOMETHING 
    } 
} 

但我將如何創建所有其他步驟喜歡在status例子嗎? 我想我會想在我的search.feature文件的以下步驟中使用$material變量,以獲得自定義步驟後面的步驟。但我該怎麼做? 我將如何遍歷所有選項列表並在每次迭代中執行一堆步驟?

+0

你不必來測試一個測試案例的所有功能。嘗試測試(並重構,如果不可能)代碼,以便每一個測試只測試一件事情,並做得很好。 在你的情況,你可以爲材料創建測試並定義了幾種不同的,但有意義的案例: - 無材料(如果可能的話) - 最少數量的材料 - 一對夫婦的平均套料 - 最大(如果定義)材料組 更改材料數量,材料名稱等可以在專門爲此目的進行的單獨測試中進行測試。 歡迎! :) – Alexander

+1

我想你不明白我。我只想測試一個功能 - 按材料搜索產品。我無法確切知道我擁有哪些材料以及其中有多少材料。 –

回答

3

您需要編寫運行所需各個步驟的PHP代碼,這些代碼位於包含代碼選擇所有選項的代碼中。

例如:

$handler = $this->getSession()->getSelectorsHandler(); 

$optionElements = $this->getSession()->getPage()->findAll('named', array('option', $handler->selectorToXpath('css', 'select)); 

foreach ($optionElements as $optionElement) { 
    $this->getSession()->getPage()->selectFieldOption('portal', $optionElement->getValue()); 
    $this->pressButton("show"); 
    $this->assertPageContainsText(" - Report Report"); 
} 
相關問題