【问题标题】:How to inject Symfony param from parameters.yml into Behat 3 configuration?如何将 Symfony 参数从 parameters.yml 注入 Behat 3 配置?
【发布时间】:2016-11-25 06:04:18
【问题描述】:

我需要为Behat\MinkExtension 设置base_url

这是我的 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
# ...

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

你能告诉你如何解决不同测试环境开发者配置的问题吗?

谢谢。

【问题讨论】:

  • @Timurib 谢谢,我已经看过这篇文章了。我希望有人能说出如何解决不同测试环境配置的问题。当然,我可以告诉开发人员:“嘿,伙计们,让我们使用域 my-app.my 进行 Behat 测试”但是......它很难看。 Behat3 也支持导入。所以也许存在一种方法来做到这一点。

标签: php symfony yaml behat


【解决方案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;
}

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 2017-08-23
    • 1970-01-01
    相关资源
    最近更新 更多