Php 行为特征中的上下文

Php 行为特征中的上下文,php,bdd,autoload,behat,Php,Bdd,Autoload,Behat,基本用例建议使用FeatureContextclass。此外,您还可以在features/bootstrap目录中指定任何其他PHP类,并按照字母顺序加载它们,而不管依赖项是什么 假设存在一个trait和一个FeatureContext类: features/bootstrap/FeatureContext.php features/bootstrap/MyLovelyTrait.php 正确加载的最佳方式是什么?显然,MyLovelyStrait是在FeatureContext中使用的: c

基本用例建议使用
FeatureContext
class。此外,您还可以在
features/bootstrap
目录中指定任何其他PHP类,并按照字母顺序加载它们,而不管依赖项是什么

假设存在一个trait和一个FeatureContext类:

features/bootstrap/FeatureContext.php
features/bootstrap/MyLovelyTrait.php
正确加载的最佳方式是什么?显然,MyLovelyStrait是在FeatureContext中使用的:

class FeatureContext extends BehatContext {
    use MyLovelyTrait;
}
这失败了,因为字母表中的
M>F


我很乐意使用composer autoloading,但我不想在
BehatContext.php
文件顶部的
autoload.php
文件中使用一次。有没有办法在
behat.yml
配置中指定这一点?此外,对于任何其他有关Behat上下文文件类加载的最佳实践答案,我们将不胜感激。

我不能100%确定这是否回答了您的问题,但我的印象是您正在尝试使用多个上下文文件?如果是这样,您不需要在FeatureContext.php构造方法中使用use语句,我们使用以下行:

$this -> useContext('Subcontext', new Subcontext($parameters));

在这种情况下,您要使用的另一个上下文称为“子上下文”。

不使用上下文(“子上下文”)的一个很好的理由可以在即将发布的Behat第3版中找到:

3.0.0beta1 / 2013-08-13
...
  * Subcontexts removed in favor of context pools

我通过对行为的分析来解决这个问题——我所有的特征都是从“A”开始的。示例:

// FeatureContext.php is at features/bootstrap/FeatureContext.php
<?php

use Behat\Behat\Context\ClosuredContextInterface,
    Behat\Behat\Context\TranslatedContextInterface,
    Behat\Behat\Context\BehatContext,
    Behat\Behat\Exception\PendingException;
use Behat\Gherkin\Node\PyStringNode,
    Behat\Gherkin\Node\TableNode;

class FeatureContext extends BehatContext
{
    use AWebDriverContextTrait;
}
//FeatureContext.php位于features/bootstrap/FeatureContext.php

作为
F>A
features/bootstrap/Autoload.php
怎么样,如果需要,自动加载程序可以加载
mylovelytracit.php
?也许不是很有创意。否则,为as创建一个票证并提供一个更新的测试。根据该功能,应该已经“开箱即用”地支持它了:(1)嗨,与traits相比,使用子文本有什么好处?我认为traits和composer自动加载是标准的,subotext是Behat特有的“专有特性”。我在Behat文档中发现了以下评论:“PHP的核心功能集还不支持水平重用。虽然这一名为traits的功能已在PHP5.4的路线图上,但Behat提供了子文本作为权宜之计的解决方案,以实现水平可重用性,直到该功能在稳定的PHP版本中可用为止。“这让我想到,既然特质是可用的,我们就不应该使用次上下文,还是应该使用?这是一个有价值的信息,但不能直接回答我的问题。在Behat 3.0中创建和加载上下文池的首选方法是什么?特征是一种选择吗?
// AWebDriverContextTrait is at features/bootstrap/AWebDriverContextTrait.php
<?php

trait AWebDriverContextTrait {
    /**
     * @Given /^I am on "([^"]+)"/
     */
    public function iAmOnSite($url)
    {
        $this->driver = new \Behat\Mink\Driver\Selenium2Driver(
            'firefox',
            ''
        );
        $this->session = new \Behat\Mink\Session($this->driver);
        $this->session->start();
        $this->session->visit($url);
    }

    private $driver;
    private $session;
}