2013-03-18 2 views
9

하위 컨텍스트 클래스를 사용하여 다른 하위 컨텍스트를 확장하고 함수를 재정의 할 수 있습니까? 현재behat 컨텍스트에서 단계 정의를 재정의 할 수 있습니까?

는 나는 그것을 우리에게 하위 컨텍스트로 SpecialTestContext에게 기능의 맥락에서

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"; 
    } 
} 

있습니다.

나는 시험 behat이


단계 "/^testScenarioExists $ /"이미 SpecialTestContext에 정의되어 :: aTestscenarioexists() [\ 예외 \의 RedundantException Behat \ Behat]

에 불만을 실행하면

누군가 내게 이것을 올바른 방향으로 가르쳐 주시겠습니까?

다른 환경에서 시나리오를 실행하고 gherkin 파일에 지정된 환경을 구현하는 것이 달성하려는 이유에 대한 자세한 정보를 제공하려면 다음을 입력하십시오.

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. 에, behat 이미 정의 단계를 모든 주석을 수집 및 매핑있다, 더 이상/방법을 이해하는

확인이를 추가 할 수 있어야 할 수 있습니다 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/ko/latest/user_guide/context. html # contexts-lifetime – aczietlow

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 패턴을 변경하지 않고 서브 클래스의 메소드를 오버라이드하는 실제 솔루션입니다. –

0

같은 문장으로 초과 된 메서드를 정의 할 수 없습니다.

class SpecialTestContext extends TestContext { 

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