【问题标题】:Behat 3 - passing parameters (from imported file) to FeatureContext constructorBehat 3 - 将参数(从导入的文件)传递给 FeatureContext 构造函数
【发布时间】:2015-02-28 23:00:23
【问题描述】:

我对 Behat 和 YAML 还很陌生,在将大型参数数组传递给 FeatureContext 构造函数时遇到了麻烦。

使用 Behat 2,以下工作正常:

behat.yml(为方便起见缩短):

default:
  context:
  extensions:
    Behat\MinkExtension\Extension:
      base_url: 'http://mysite.local'
      goutte: ~
      selenium2: ~
      ...
imports:
    - config/data/mydata.yml

和 mydata.yml:

default:
  context:
    parameters:
      some_long_array:
        'key1': 'value1'
        'key2': 'value2'
        ...

我可以有很多这样的导入参数文件。

使用 Behat 3 - 我尝试通过以下方式实现相同的目标 behat.yml(缩短):

default:
  suites:
    default:
      contexts:
        - FeatureContext
  extensions:
    Behat\MinkExtension:
      base_url: 'http://mysite.local'
      goutte: ~
      selenium2: ~
  ...
imports:
    - config/data/mydata.yml

和 mydata.yml:

default:
  suites:
    default:
      contexts:
        - FeatureContext:
            parameters:
              some_long_array:
                'key1': 'value1'
                'key2': 'value2'
                ...

这不起作用,并且没有任何东西传递给构造函数。

可恢复的致命错误:参数 1 传递给 FeatureContext::__construct() 必须是数组类型,没有给出 FeatureContext->__construct()

我的 FeatureContext 类如下所示:

class FeatureContext implements SnippetAcceptingContext
{

  /**
   * Initializes context.
   *
   * Every scenario gets its own context instance.
   * You can also pass arbitrary arguments to the
   * context constructor through behat.yml.
   */
  public function __construct(array $parameters)
  {
    var_dump($parameters);
  }

}

如果我在 behat.yml 中(而不是在导入的文件中)传递参数,一切正常:

default:
  suites:
    default:
      contexts:
        - FeatureContext:
            parameters:
              some_long_array:
                'key1': 'value1'
                'key2': 'value2'
  extensions:
    Behat\MinkExtension:
      base_url: 'http://mysite.local'
      goutte: ~
      selenium2: ~
  ...

测试运行,我可以看到预期的数组。问题是我有几个大的参数数组,在 behat.yml 文件中指定它们是不切实际的。

如何使用 Behat 3 在外部文件中指定大型参数数组?

【问题讨论】:

  • 您是否找到了解决您想要做的事情的方法?我面临同样的问题,现在找不到合适的东西。谢谢!

标签: php yaml behat


【解决方案1】:

你是如此亲密的人。我能够这样做:

default:
    autoload: [ %paths.base%/contexts ]
    extensions:
        Behat\MinkExtension:
            base_url: http://qa.api.somesite.com
            sessions:
                default:
                    selenium2: ~
        Sanpi\Behatch\Extension: ~
    suites:
        default:
            paths:    [ %paths.base%/features ]
            filters:
            contexts:
                - FeatureContext
                - Behat\MinkExtension\Context\MinkContext
        frontend:
            paths:    [ %paths.base%/features/frontend ]
            filters:
            contexts:
                - FeatureContext:
                    parameters:
                        environment: qa
                        api_url: http://api.somesite.com
                        login: some_login
                        key: 409jfa94k4tj
                - Behat\MinkExtension\Context\MinkContext
                - behatch:browser

如果您在“前端”套件下注意到我有上下文“FeatureContext”。下面是 FeatureContext 类的构造函数所期望的参数名称。然后它会自动把它变成一个关联数组。

【讨论】:

  • 请记住,函数定义必须使用与 behat.yml 文件中相同的参数名称。
  • 除非我遗漏了什么,但用户imports 似乎并不这样。在 behat 3.1.0 中这仍然可能吗?我想要一个“基础”behat.yml 文件,它导入一个 config.yml 文件,其中包含 api_url、登录名、密钥等项目。这意味着 behat.yml 文件可以是版本控制的,并且 config.yml 文件可以是版本控制的。 yml 可以是特定于环境的。
  • @RichardTape 是否存在导入解决方案?我现在面临同样的问题,如果没有解决方案,我会编写自己的扩展以使其成为可能
  • 如果有解决方案,我还没有找到它@EmilioMg -- 请,如果你找到了,请报告:)
  • 我记得在 Behat 2 中我能够引用其他 YML 文件。但是我还没有尝试过 Behat 3,而且我已经离开了与 Behat 一起工作一年半的工作。所以我什至无法访问我的旧代码。
猜你喜欢
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 2019-03-18
相关资源
最近更新 更多