Behat 3 - передача параметров (из импортированного файла) в конструктор FeatureContext

Я новичок в 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);
  }

}

Если я передам параметры inline в 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?


person smrkem    schedule 02.01.2015    source источник
comment
Нашли ли вы какое-либо решение того, что вы пытались сделать? Я столкнулся с той же проблемой и не мог найти ничего подходящего на данный момент. Спасибо!   -  person LaurentG    schedule 24.05.2016


Ответы (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. Затем он автоматически превращает его в ассоциативный массив.

person Patrick    schedule 16.02.2015
comment
Просто имейте в виду, что определение функции должно использовать то же имя параметра, что и в файле behat.yml. - person Patrick; 17.02.2015
comment
Если я что-то не упустил, это не похоже на пользователя imports. Это все еще возможно в behat 3.1.0? Я хотел бы иметь «базовый» файл behat.yml, который импортирует файл config.yml, содержащий такие элементы, как api_url, логин, ключ и т. д. Это означает, что файл behat.yml может контролироваться версией, а файл config. yml может зависеть от среды. - person RichardTape; 18.05.2016
comment
@RichardTape существует ли решение для импорта? Я сталкиваюсь с той же проблемой прямо сейчас, если нет решения, я бы написал собственное расширение, чтобы сделать это возможным. - person EmilioMg; 08.08.2016
comment
Если есть решение, я его еще не нашел @EmilioMg -- пожалуйста, сообщите, если найдете :) - person RichardTape; 09.08.2016
comment
Я помню, что в Behat 2 я мог ссылаться на другие файлы YML. Но я не пробовал в Behat 3 и уже полтора года не работаю с Behat. Так что у меня даже нет доступа к моему старому коду. - person Patrick; 09.08.2016
comment
@RichardTape imports @smrkem, который написал в своем вопросе, отлично работает в Behat v3. У вас есть behat.yml, который содержит всю статическую конфигурацию, а вверху behat.yml у вас есть imports:\n\t - config/config.yml (с новой строкой и вкладкой). Этот файл находится в .gitignore и является клоном behat.yml в отношении ключей конфигурации и вложений, но он содержит только конфигурации среды, такие как URL-адреса, пути, ключи API и т. д. Это отлично работает для меня. Я также сделал config.yml.dist с демо-конфигурацией по умолчанию, которую я проверил в репозитории git. - person EmilioMg; 10.08.2016
comment
2 вещи: убедитесь, что у вас есть правильный отступ для parameters под - FeatureContext: и убедитесь, что вы перегенерировали классы автозагрузки композитора composer dumpautoload - person Alex Skrypnyk; 14.08.2016
comment
@EmilioMg Хорошо, тогда я явно очень глуп, я просто не могу заставить его работать. Я пробовал следующее: gist.github.com/richardtape/46b38590d04b04f03aa690f52d9a5853, но ничего не помогло работай. Я либо получаю ошибки, как описано в этой сути, либо значение никогда не переопределяется. Есть ли шанс, что вы можете привести конкретный пример этой работы? - person RichardTape; 02.09.2016