使用 Codeception 和 Gherkin 时 PhpStorm 中未定义的步骤引用
Undefined step reference in PhpStorm when using Codeception and Gherkin
我希望能够在使用 Codeception 时在 Gherkin 功能文件中使用 PhpStorm 的 "Go To Declaration" 功能(Command + B on a Mac) .但是,PhpStorm 似乎没有弄清楚步骤的定义位置,并输出此警告:
Undefined step reference: […]
当我使用 Behat 时,PhpStorm 了解步骤的定义位置。
重现步骤
mkdir codeception
cd codeception
composer require "codeception/codeception" --dev
./vendor/bin/codecept bootstrap
./vendor/bin/codecept generate:feature acceptance first
- 在PhpStorm中打开项目目录。
- 确保 PhpStorm 知道已安装 Codeception:
- 确保安装了 PhpStorm 插件 Gherkin 和 Codeception Framework。
- 向
tests/acceptance/first.feature
添加一个步骤。
./vendor/bin/codecept gherkin:snippets acceptance
这将产生以下代码。 (并非所有内容都包括在内 - 如果我需要添加任何内容,请告诉我。)
tests/acceptance/first.feature
:
Feature: first
In order to ...
As a ...
I need to ...
Scenario: try first
When I visit "/"
tests/_support/AcceptanceTester.php
:
<?php
/**
* Inherited Methods
* @method void wantToTest($text)
* @method void wantTo($text)
* @method void execute($callable)
* @method void expectTo($prediction)
* @method void expect($prediction)
* @method void amGoingTo($argumentation)
* @method void am($role)
* @method void lookForwardTo($achieveValue)
* @method void comment($description)
* @method \Codeception\Lib\Friend haveFriend($name, $actorClass = NULL)
*
* @SuppressWarnings(PHPMD)
*/
class AcceptanceTester extends \Codeception\Actor
{
use _generated\AcceptanceTesterActions;
/**
* Define custom actions here
*/
/**
* @When I visit :arg1
*/
public function iVisit($arg1)
{
throw new \Codeception\Exception\Incomplete("Step `I visit :arg1` is not defined");
}
}
但是,PhpStorm 不知道 iVisit()
在哪里。我该如何解决这个问题?
目前 PhpStorm 似乎使用 Behat Context 接口来确定哪些 类 定义了 .feature 文件中 Gherkin 步骤的实现,因此有一个解决方法让 PhpStorm 找到codeception 测试器中的步骤是在源代码树
中的某处添加 Behat\Behat\Context\Context
接口
/* Context.php */
namespace Behat\Behat\Context;
interface Context { }
然后让 AcceptanceTester
实现该接口(这是一个空标记接口)
class AcceptanceTester extends \Codeception\Actor implements Context ...
建立 答案。
将其添加到 AcceptanceTester 文件的顶部。
namespace Behat\Behat\Context {
interface Context { }
}
然后让 AcceptanceTester 实现它。像这样包装命名空间是 PHP 测试其他命名空间中存在的假方法的常见技巧。
namespace {
class AcceptanceTester extends \Codeception\Actor implements \Behat\Behat\Context\Context
}
}
我有另一个步骤定义文件,我使用 Behat 的上下文。然后在 class 声明中实现 Context。
use Behat\Behat\Context;
class myClassSteps implements Context\Context
{
step definitions
}
对我有用。
我希望能够在使用 Codeception 时在 Gherkin 功能文件中使用 PhpStorm 的 "Go To Declaration" 功能(Command + B on a Mac) .但是,PhpStorm 似乎没有弄清楚步骤的定义位置,并输出此警告:
Undefined step reference: […]
当我使用 Behat 时,PhpStorm 了解步骤的定义位置。
重现步骤
mkdir codeception
cd codeception
composer require "codeception/codeception" --dev
./vendor/bin/codecept bootstrap
./vendor/bin/codecept generate:feature acceptance first
- 在PhpStorm中打开项目目录。
- 确保 PhpStorm 知道已安装 Codeception:
- 确保安装了 PhpStorm 插件 Gherkin 和 Codeception Framework。
- 向
tests/acceptance/first.feature
添加一个步骤。 ./vendor/bin/codecept gherkin:snippets acceptance
这将产生以下代码。 (并非所有内容都包括在内 - 如果我需要添加任何内容,请告诉我。)
tests/acceptance/first.feature
:
Feature: first
In order to ...
As a ...
I need to ...
Scenario: try first
When I visit "/"
tests/_support/AcceptanceTester.php
:
<?php
/**
* Inherited Methods
* @method void wantToTest($text)
* @method void wantTo($text)
* @method void execute($callable)
* @method void expectTo($prediction)
* @method void expect($prediction)
* @method void amGoingTo($argumentation)
* @method void am($role)
* @method void lookForwardTo($achieveValue)
* @method void comment($description)
* @method \Codeception\Lib\Friend haveFriend($name, $actorClass = NULL)
*
* @SuppressWarnings(PHPMD)
*/
class AcceptanceTester extends \Codeception\Actor
{
use _generated\AcceptanceTesterActions;
/**
* Define custom actions here
*/
/**
* @When I visit :arg1
*/
public function iVisit($arg1)
{
throw new \Codeception\Exception\Incomplete("Step `I visit :arg1` is not defined");
}
}
但是,PhpStorm 不知道 iVisit()
在哪里。我该如何解决这个问题?
目前 PhpStorm 似乎使用 Behat Context 接口来确定哪些 类 定义了 .feature 文件中 Gherkin 步骤的实现,因此有一个解决方法让 PhpStorm 找到codeception 测试器中的步骤是在源代码树
中的某处添加Behat\Behat\Context\Context
接口
/* Context.php */
namespace Behat\Behat\Context;
interface Context { }
然后让 AcceptanceTester
实现该接口(这是一个空标记接口)
class AcceptanceTester extends \Codeception\Actor implements Context ...
建立
将其添加到 AcceptanceTester 文件的顶部。
namespace Behat\Behat\Context {
interface Context { }
}
然后让 AcceptanceTester 实现它。像这样包装命名空间是 PHP 测试其他命名空间中存在的假方法的常见技巧。
namespace {
class AcceptanceTester extends \Codeception\Actor implements \Behat\Behat\Context\Context
}
}
我有另一个步骤定义文件,我使用 Behat 的上下文。然后在 class 声明中实现 Context。
use Behat\Behat\Context;
class myClassSteps implements Context\Context
{
step definitions
}
对我有用。