2011-09-11 17 views
8

Behat默认在文件FeatureContext(一个文件中的所有步骤)中查找步骤定义。
有很多步骤,很难保持这样一个大文件。Behat外部文件中的步骤定义

我想每个功能文件都有一个定义文件。

如何在外部文件中使用步骤定义?

例如

homepage.feature 
HomepageContext extends FeatureContext 

回答

6

使用类继承和单独的上下文。

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

然后在/feature/FeatureContext.php导入上下文文件:

/** 
* 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

Behat有多种选项可以将您的FeatureContext分成多个类。首先,你可以使用老派的php5继承。如果继承不是您想要的,Behat还支持子上下文:“Using Subcontexts”。

接下来,如果您想给您的班级命名的方式与FeatureContext不同,您可以重新定义behat.yml配置文件的“Context Configuration”部分。

这样,您可以将通用定义和钩子拆分为不同的类,并在其他功能套件中使用它们,以及使用子交接或继承。

但你的问题也问:

我想有每个功能的文件一个定义文件。

这个要求是完全错误的。 Behat和场景BDD的全部内容都是描述业务术语中的应用行为并为描述的行为创建测试字典。牢记这一点,您逻辑上不能为一个功能集设置多个不同的字典。通过编写步骤定义,您可以告诉Behat Given I am on "/news"的含义。当你想要这一步意味着从功能到功能的不同事情 - 你做错了。

贝哈特由2个主要和足够独立的概念:

  1. *.feature文件,写在小黄瓜语言。这些文件应该是自描述性的。意思是说,他们应该为读者提供所有信息以便了解它们。小黄瓜不是您的功能测试的新编程语言,它只是一个降价为您的用户故事!
  2. FeatureContext.php类,描述Behat应如何测试您的功能。它定义了整个应用程序功能套件中使用的应用程序范围字典。这是您的降价式用户故事和实际功能测试之间的编程桥梁。

而且你不应该搞砸这件事。单个功能套件应该有单步字典(定义)。但是,由于继承和子上下文,您可以在多个功能套件中使用单个字典。是的,你可以将单套字典分成多个php类;-)

+0

我明白你来自哪里,但你是否忘记维持规格的痛苦? Sfisioza的观点(我猜)是关于这个的。如果某人有复杂的系统,那么可能会遇到如此痛苦的经历,那就是通过整体的FeatureContext.php – RVM

0

一种解决方案是水平再利用,子上下文。为每个“功能组”使用一个subContext。

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版本。 Behat 3.x中删除了'useContext'方法。 –

+0

Behat3中useContext的替代方案是什么? –

相关问题