Строка Behat должна быть экземпляром Behat \ Gherkin \ Node \ PyStringNode

У меня есть следующий метод в моем 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), но я понятия не имею, как это исправить.

1

Решение

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)
{
}
0

Другие решения

пока никто не знает что PyStringNode на самом деле, ваш метод требует объекта PyStringNode класс здесь. Таким образом, вам нужно создать его следующим образом:

$string = new PyStringNode();

и передать это вашему iSendARequestToWithData() функция или изменить сигнатуру функции и удалить PyStringNode от этого, как вы, кажется, на самом деле не пользуетесь такой строгой подписью.

public function iSendARequestToWithData($method, $uri, $string)
-2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector