2011-09-11 18 views
8

デフォルトでは、BehatはFeatureContextという名前のファイル(1つのファイル内のすべてのステップ)でステップ定義を探します。
多くの手順があるので、大きなファイルを維持するのは難しいです。Behatの外部ファイルのステップ定義

フィーチャーファイルごとに1つの定義ファイルが必要です。

ステップ定義を外部ファイルに含めるにはどうすればよいですか?

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設定ファイルの ""セクションにその名前を再定義することができます。

このようにして、共通定義とフックを別々のクラスに分割し、サブコンテキストまたは継承の他のフィーチャスイートで使用することができます。

しかし、あなたの質問も尋ねる:

私はフィーチャーファイルごとに1つの定義ファイルを持っているしたいと思います。

このリクエストは完全に間違っています。 BehatとシナリオBDDは、ビジネス上のアプリケーションの動作を記述し、記述された動作のテスト辞書を作成することに関するものです。論理的には、1つのフィーチャセットに対して複数の異なる辞書を持つことはできません。ステップ定義を書くことによって、あなたはBehatにそのGiven I am on "/news"の意味を伝えています。そして、そのステップがフィーチャーごとに異なるものを意味するようにしたいとき、それは間違っています。ガーキン言語で書かれた

  1. *.featureファイル:

    Behatは、2つのメインと十分に独立した概念で構成されています。これらのファイルは自己記述的でなければなりません。それを理解するためには読者のためのすべての情報を提供すべきであることを意味する。 Gherkinはあなたの機能テストのための新しいプログラミング言語ではありません。マークダウンあなたのユーザーストーリーのためだけです!

  2. FeatureContext.phpのクラスでは、Behatがどのように機能をテストするのかについて説明しています。これは、アプリケーション全体の機能スイート全体で使用されるアプリケーション全体の辞書を定義します。これは、マークダウンのようなユーザーストーリーと実際の機能テストの間のプログラミングの橋です。

あなたはこのことを混乱させるべきではありません。単一フィーチャスイートには、単一ステップ辞書(定義)が必要です。しかし、継承とサブコンテキストのおかげで、複数のフィーチャースイートで1つの辞書を使用することができます。そして、はい、単一のスイート辞書を複数の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

これはBehatの2.xバージョンでのみ当てはまります。 'useContext'メソッドはBehat 3.xで削除されました。 –

+0

Behat3のuseContextの代わりになるものは何ですか? –