Я довольно новичок в 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 -> __ конструкт ()
Мой класс 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?
Вы были так близки, мужик. Я смог сделать это так:
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. Затем он автоматически превращает его в ассоциативный массив.
Других решений пока нет …