Behat字符串必须是Behat \ Gherkin \ Node \ PyStringNode的实例

时间:2015-01-12 18:43:39

标签: php behat

我在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),但我不知道如何修复它。

2 个答案:

答案 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)