У меня есть следующий метод в моем FeatureContext.php
:
/**
* @When /^I send a ([A-Z]+) request to "([^"]*)" (with the data)$/
*/
public function iSendARequestToWithData($method, $uri, PyStringNode $string)
{
$request = $this->client->createRequest($method, $this->base_url.$uri);
$this->response = $this->client->send($request);
}
При запуске моих функций эта строка не работает:
When I send a POST request to "/items" with the data
"""{
"category": 1
}
"""
Со следующей ошибкой:
Catchable Fatal Error: Argument 3 passed to FeatureContext::iSendARequestToWithData() must be an instance of Behat\Gherkin\Node\PyStringNode, string given in app/tests/acceptance/FeatureContext.php line 68
Я думаю, это связано с моим этим регулярным выражением, особенно (with the data)
, но я понятия не имею, как это исправить.
Behat использует регулярные выражения сопоставить шаг с методом, который должен быть вызван. Регулярное выражение подмасками используются для сопоставления аргументов метода.
Подмаски
Каждый подшаблон регулярного выражения используется в качестве аргумента вашего метода.
В вашем примере:
([A-Z]+)
будет передан как $method
([^"]*)
будет передан как $uri
(with the data)
как $string
PyStringNode
передается как последний, в этом случае четвертый аргумент.Не захватывая подшаблоны
Используйте не захватывающие подшаблоны, если вы не хотите захватывать аргумент:
(?:non matching pattern)
Чтобы исправить ваш пример:
/**
* @When /^I send a ([A-Z]+) request to "([^"]*)" (?:with the data)$/
*/
public function iSendARequestToWithData($method, $uri, PyStringNode $string)
{
}
Именованные подшаблоны
Вы также можете использовать именованные подшаблоны, чтобы явно указать, куда должны быть переданы соответствующие шаблоны. В таком случае порядок аргументов, сопоставляемых с помощью шаблона, не имеет значения, Behat будет сопоставлять их по имени:
/**
* @When /^I send a (?P<method>[A-Z]+) request to "(?P<uri>[^"]*)" (?:with the data)$/
*/
public function iSendARequestToWithData($method, $uri, PyStringNode $string)
{
}
Синтаксис репы
Behat 3 использует синтаксис репы, который я рекомендую использовать, если вы не знакомы с регулярными выражениями.
/**
* @When I send a :method request to :uri with the data
*/
public function iSendARequestToWithData($method, $uri, PyStringNode $string)
{
}
пока никто не знает что PyStringNode
на самом деле, ваш метод требует объекта PyStringNode
класс здесь. Таким образом, вам нужно создать его следующим образом:
$string = new PyStringNode();
и передать это вашему iSendARequestToWithData()
функция или изменить сигнатуру функции и удалить PyStringNode
от этого, как вы, кажется, на самом деле не пользуетесь такой строгой подписью.
public function iSendARequestToWithData($method, $uri, $string)