如何从parameters.yml中将Symfony param注入Behat 3配置?

时间:2016-11-25 06:04:18

标签: php symfony yaml behat

我需要为base_url设置Behat\MinkExtension

以下是 app / config / parameters.yml 的一部分:

parameters:
    # ...
    behat_base_url: http://my-app.local/app_test.php
    # ...

以下是 behat.yml 的一部分:

frontend:
    gherkin:
        filters:
            tags: "@frontend"
    suites:
        javascript:
            mink_session: default
            mink_javascript_session: selenium2
            contexts:
                - FeatureContext: ~

    extensions:
        Behat\Symfony2Extension: ~
        Behat\MinkExtension:
            base_url: http://my-app.local/app_test.php
            sessions:
                default:
                    symfony2: ~
                selenium2:
                    selenium2:
                        browser: chrome
                        capabilities:
                            extra_capabilities:
                                chromeOptions:
                                    args: ["--start-maximized"]

我可以做这样的事情(提供对parameters.behat_base_url的参考)

imports:
    - app/config/parameters.yml

# ...
extensions:
    Behat\Symfony2Extension: ~
    Behat\MinkExtension:
        base_url: *parameters.behat_base_url # reference to value from parameters.yml
# ...

或者可能存在另一种正确且“真实”的方式,我可以如何从base_url或其他地方设置parameters.yml。因此,任何开发人员都将拥有自己的测试环境配置。

您能告诉我您如何使用不同的测试环境开发人员的配置解决问题吗?

感谢。

1 个答案:

答案 0 :(得分:1)

因此。我找到了两个解决方案。

第一个:使用BEHAT_PARAMS进行配置。例如:

在命令行中运行。

export BEHAT_PARAMS='{"extensions":{"Behat\\MinkExtension":{"base_url":"http://my-app.local/app_test.php"}}}'

注意:在这种情况下,它指定默认参数,因此您不应在behat.yml中定义这些参数(因为它们具有更高的优先级并将被覆盖)。您可以在behat docs

中阅读相关内容

但这个案子不适合我。每次配置环境时我都不想要开发人员。

第二个

我在FeatureContext中指定了以下方法:

/** @BeforeScenario */
public function beforeScenario(\Behat\Behat\Hook\Scope\BeforeScenarioScope $scenario)
{
    if ($scenario->getSuite()->getName() == 'javascript') {
        $this->setMinkParameter('base_url', $this->getContainer()->getParameter('behat_base_url'));
    }
}

因此,在每个场景之前,我会检查套件是javascript并设置base_url。我使用容器从parameters.yml获得的值。 也许它有点"脏"技巧,但它对我来说很好。

从内核中获取容器。要注入内核,您应该实现Behat\Symfony2Extension\Context\KernelAwareContext并添加方法setKernel()

public function setKernel(KernelInterface $kernel)
{
    $this->kernel = $kernel;
}

所以,我选择第二种方式。

如果有人知道更优雅的解决方案,请告诉我。