2011-09-11 3 views
8

기본적으로 Behat은 FeatureContext (하나의 파일에있는 모든 단계) 파일에서 단계 정의를 찾습니다.
많은 단계가 있으므로 큰 파일을 유지하기가 어렵습니다.Behat의 외부 파일에있는 단계 정의

필자는 기능 파일 당 하나의 정의 파일을 갖고 싶습니다.

외부 파일에 단계 정의를 어떻게 넣을 수 있습니까?

homepage.feature 
HomepageContext extends FeatureContext 

답변

6

클래스 상속과 별도의 컨텍스트를 사용하십시오./feature/FeatureContext.php에서 다음

# /features/contexts/ 
AbstractContext extends BehatContext {} 
FeaturenameContext extends AbstractContext {} 

컨텍스트 파일을 가져옵니다

/** 
* Initializes context. 
* Every scenario gets it's own context object. 
* 
* @param array $parameters context parameters (set up via behat.yml) 
*/ 
public function __construct(array $parameters) { 

    // import all context classes from context directory, except the abstract one 

    $filesToSkip = array('AbstractContext.php'); 

    $path = dirname(__FILE__) . '/../contexts/'; 
    $it = new RecursiveDirectoryIterator($path); 
    /** @var $file SplFileInfo */ 
    foreach ($it as $file) { 
     if (!$file->isDir()) { 
      $name = $file->getFilename(); 
      if (!in_array($name, $filesToSkip)) { 
       $class = pathinfo($name, PATHINFO_FILENAME); 
       require_once dirname(__FILE__) . '/../context/' . $name; 
       $this->useContext($class, new $class($parameters)); 
      } 
     } 
    } 
} 
24

FeatureContext를 여러 클래스로 나눌 수있는 여러 옵션이 있습니다. 첫째, 구식 php5 상속을 사용할 수 있습니다. 상속이 원하는 것이 아닌 경우 Behat은 하위 콘텍스트 인 "Using Subcontexts"도 지원합니다.

다음으로 클래스 이름을 FeatureContext과 다르게 지정하려는 경우 behat.yml 구성 파일의 "Context Configuration"섹션에서 해당 클래스의 이름을 다시 정의 할 수 있습니다.

이렇게하면 공통 정의와 후크를 별도의 클래스로 분리하여 서브 컨텍스트 또는 상속과 함께 다른 피처 세트에서 사용할 수 있습니다.

은 그러나 귀하의 질문은 묻습니다 :

나는 기능 파일 당 하나 개의 정의 파일을 가지고 싶습니다.

이 요청은 완전히 잘못되었습니다. Behat 및 시나리오 BDD는 비즈니스 측면에서의 응용 프로그램 동작을 설명하고 설명 된 동작에 대한 테스트 사전을 만드는 것에 관한 것입니다. 이를 염두에두고 논리적으로 하나의 기능 세트에 대해 여러 가지 사전을 가질 수는 없습니다. 단계 정의를 작성함으로써 Behat에게 그 의미가 Given I am on "/news"임을 알립니다. 그리고 그 단계가 기능마다 다른 것을 의미하기를 원할 때 - 당신은 그것을 잘못하고 있습니다.

Behat 2 개 주 충분히 별도의 개념으로 구성되어 작은 오이 언어로 작성된

  1. *.feature 파일을. 이러한 파일은 자기 설명 적이어야합니다. 즉, 독자가 이해할 수 있도록 모든 정보를 제공해야한다는 의미입니다. Gherkin은 기능 테스트를위한 새로운 프로그래밍 언어는 아니며 사용자 스토리를위한 마크 다운입니다.
  2. FeatureContext.php 클래스는 Behat이 기능을 테스트하는 방법을 설명합니다. 전체 응용 프로그램 기능 모음과 함께 사용되는 응용 프로그램 전체 사전을 정의합니다. 이것은 마크 다운과 같은 사용자 스토리와 실제 기능 테스트 사이의 프로그래밍 다리입니다.

그리고이 일을 망쳐서는 안됩니다. 단일 기능 모음에는 단일 단계 사전 (정의)이 있어야합니다. 그러나 당신은 상속과 subcontexts 덕분에 하나 이상의 feature suite에서 single dictionary를 사용할 수 있습니다. 그리고 네, 하나의 스위트 사전을 여러 개의 PHP 클래스로 나눌 수 있습니다 ;-)

+0

나는 어디에서 왔는지 알고 있지만 사양을 유지하는 데 따른 고통을 잊고 있습니까? Sfisioza의 요지는 이것에 관한 것이 었습니다. 복잡한 시스템을 가지고있는 사람이라면 획기적인 FeatureContext.php를 경험할 수 있습니다. – RVM

0

하나의 솔루션은 하위 컨텍스트와 수평 재사용입니다. 각 "기능 그룹"에 대해 하위 컨텍스트를 사용하십시오.

class FeatureContext extends BehatContext 
{ 

    public function __construct(array $context_parameters) 
    { 
     $this->useContext('math_context', new MathContext()); 
     $this->useContext('bash_context', new BashContext()); 
    } 
} 
+0

이것은 2.x 버전의 Behat에서만 유효합니다. 'useContext' 메소드는 Behat 3.x에서 삭제되었습니다. –

+0

Behat3에서 useContext를 대체 할 수있는 것은 무엇입니까? –

관련 문제