2013-03-18 73 views
9

是否有可能讓子上下文類擴展另一個子上下文並覆蓋函數?是否可以覆蓋behat上下文中的步驟定義?

目前我有

class TestContext extends BehatContext { 
    /** 
    * @Given /^a testScenarioExists$/ 
    */ 
    public function aTestscenarioexists() { 
     echo "I am a generic test scenario\n"; 
    } 
} 

class SpecialTestContext extends TestContext { 
    /** 
    * @Given /^a testScenarioExists$/ 
    */ 
    public function aTestscenarioexists() { 
     echo "I am a special test scenario\n"; 
    } 
} 

在功能方面,我告訴它我們SpecialTestContext作爲子上下文。

當運行測試貝哈特與

抱怨[貝哈特\貝哈特\異常\ RedundantException]
步驟 「/ ^一個testScenarioExists $ /」 已經在SpecialTestContext定義:: aTestscenarioexists()

請問有人可以用這個指出我的正確方向嗎?

給一些進一步的信息,爲什麼我試圖做到這一點我想實現是運行與不同的環境場景的能力,並有小黃瓜文件中指定的環境中,例如:

Scenario: Test with generic environment 
Given I am in the environment "generic" 
    And a test scenario exists 

Scenario: Test with specialised environment 
Given I am in the environment "specialised" 
    And a test scenario exists 

然後我可以使用在FeatureContext中添加一些代碼來加載正確的子上下文。

回答

4

總之......這是不可能的:http://docs.behat.org/guides/2.definitions.html#redundant-step-definitions

在裝載子環境方面動態,這是不可能的:

  1. 子上下文是在「編譯時」裝 - 即。在主FeatureContext構造
  2. 通過第一步定義運行的時間,貝哈特已經收集了所有註解和映射他們的步驟定義,沒有更多的可以/應該加入

檢查了這一點,以瞭解如何一個Context的行爲: http://docs.behat.org/guides/4.context.html#contexts-lifetime

夫婦的更廣泛的事情要考慮:

  1. 在任何一個小黃瓜場景拍攝多畝非開發人員可以理解(或者至少是沒有編寫系統的開發人員!)。一個場景應該傳達完整的,一個(理想情況下不多於)業務規則,而無需挖掘任何代碼

  2. 您不想在步驟定義中隱藏太多邏輯,任何規則都應該在小黃瓜情景

  3. 這是給你的,你如何組織你的FeatureContexts,但你會希望通過主題/域系統內做到這一點,例如:

    • 一個DatabaseContext可以閱讀關注+寫入測試分區
    • ApiContext可能包含涉及您的系統
    • CommandContext內驗證的API可以驗證您的系統控制檯有關步驟命令
+0

只是更新上面提供的鏈接。 * http://docs.behat.org/en/latest/user_guide/context/definitions.html#redundant-step-definitions * http://docs.behat.org/en/latest/user_guide/context。 html#contexts-lifetime – aczietlow 2017-08-24 17:07:26

9

正如羅布·斯夸爾斯所提到的,動力方面裝載將無法正常工作。

但我確實有一個解決方法來覆蓋步驟定義,我經常使用。 不要註釋你的方法。 Behat將在超類中選取重寫方法的註釋,並將該方法名稱映射到匹配步驟。當找到匹配步驟時,將調用子類中的方法。爲了說明問題,我已經開始爲此使用@override註釋。 @override註釋對Behat沒有特殊意義。

class SpecialTestContext extends TestContext { 
    /** 
    * @override Given /^a testScenarioExists$/ 
    */ 
    public function aTestscenarioexists() { 
     echo "I am a special test scenario\n"; 
    } 
} 
+1

這是實際的解決方案 - 在子類中重寫方法,而不更改模式docblock。 – 2014-03-28 12:56:31

0

無法用同一句子定義重寫的方法。

class SpecialTestContext extends TestContext { 

    public function aTestscenarioexists() { 
    echo "I am a special test scenario\n"; 
    } 
} 
相關問題