我在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)
,但我不知道如何修复它。
答案 0 :(得分:0)
Behat使用regular expressions来匹配应该调用的方法的步骤。正则表达式子模式用于匹配方法参数。
<强>子模式强>
正则表达式中的每个子模式都用作方法的参数。
在你的例子中:
([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)
{
}
Turnip语法
Behat 3使用萝卜语法,如果你不熟悉正则表达式,我推荐使用。
/**
* @When I send a :method request to :uri with the data
*/
public function iSendARequestToWithData($method, $uri, PyStringNode $string)
{
}
答案 1 :(得分:-2)
虽然没有人知道PyStringNode
到底是什么,但你的方法需要PyStringNode
类的对象。所以你基本上需要创建它:
$string = new PyStringNode();
并将其传递给您的iSendARequestToWithData()
函数,或者更改函数签名并从中删除PyStringNode
,因为您似乎并没有从如此严格的签名中受益。
public function iSendARequestToWithData($method, $uri, $string)