デフォルトでは、BehatはFeatureContext
という名前のファイル(1つのファイル内のすべてのステップ)でステップ定義を探します。
多くの手順があるので、大きなファイルを維持するのは難しいです。Behatの外部ファイルのステップ定義
フィーチャーファイルごとに1つの定義ファイルが必要です。
ステップ定義を外部ファイルに含めるにはどうすればよいですか?
homepage.feature
HomepageContext extends FeatureContext
デフォルトでは、BehatはFeatureContext
という名前のファイル(1つのファイル内のすべてのステップ)でステップ定義を探します。
多くの手順があるので、大きなファイルを維持するのは難しいです。Behatの外部ファイルのステップ定義
フィーチャーファイルごとに1つの定義ファイルが必要です。
ステップ定義を外部ファイルに含めるにはどうすればよいですか?
homepage.feature
HomepageContext extends FeatureContext
クラスの継承と別のコンテキストを使用します。/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));
}
}
}
}
あなたのFeatureContextを複数のクラスに分割する複数のオプションがあります。まず、古い学校のphp5継承を使うことができます。継承があなたが望むものでない場合、Behatはサブコンテキスト「Using Subcontexts」もサポートします。
次に、クラスの名前をFeatureContext
と異なるようにする場合は、behat.yml
設定ファイルの ""セクションにその名前を再定義することができます。
このようにして、共通定義とフックを別々のクラスに分割し、サブコンテキストまたは継承の他のフィーチャスイートで使用することができます。
しかし、あなたの質問も尋ねる:
私はフィーチャーファイルごとに1つの定義ファイルを持っているしたいと思います。
このリクエストは完全に間違っています。 BehatとシナリオBDDは、ビジネス上のアプリケーションの動作を記述し、記述された動作のテスト辞書を作成することに関するものです。論理的には、1つのフィーチャセットに対して複数の異なる辞書を持つことはできません。ステップ定義を書くことによって、あなたはBehatにそのGiven I am on "/news"
の意味を伝えています。そして、そのステップがフィーチャーごとに異なるものを意味するようにしたいとき、それは間違っています。ガーキン言語で書かれた
*.feature
ファイル: Behatは、2つのメインと十分に独立した概念で構成されています。これらのファイルは自己記述的でなければなりません。それを理解するためには読者のためのすべての情報を提供すべきであることを意味する。 Gherkinはあなたの機能テストのための新しいプログラミング言語ではありません。マークダウンあなたのユーザーストーリーのためだけです!
FeatureContext.php
のクラスでは、Behatがどのように機能をテストするのかについて説明しています。これは、アプリケーション全体の機能スイート全体で使用されるアプリケーション全体の辞書を定義します。これは、マークダウンのようなユーザーストーリーと実際の機能テストの間のプログラミングの橋です。あなたはこのことを混乱させるべきではありません。単一フィーチャスイートには、単一ステップ辞書(定義)が必要です。しかし、継承とサブコンテキストのおかげで、複数のフィーチャースイートで1つの辞書を使用することができます。そして、はい、単一のスイート辞書を複数のPHPクラスに分割できます;
一つの解決策は、サブコンテキストと水平再利用性です。各「フィーチャグループ」にサブコンテキストを使用します。
class FeatureContext extends BehatContext
{
public function __construct(array $context_parameters)
{
$this->useContext('math_context', new MathContext());
$this->useContext('bash_context', new BashContext());
}
}
これはBehatの2.xバージョンでのみ当てはまります。 'useContext'メソッドはBehat 3.xで削除されました。 –
Behat3のuseContextの代わりになるものは何ですか? –
私はあなたがどこから来たのか理解していますが、スペックを維持するという苦労を忘れていますか? Sfisiozaのポイント(私が推測する)はこれに関するものでした。誰かが複雑なシステムを持っているなら、モノリシックFeatureContext.phpを通るような苦痛を経験するかもしれません。 – RVM