使用Codeception和Gherkin时,PhpStorm中的未定义步骤引用

时间:2017-06-26 18:08:34

标签: php phpstorm codeception behat gherkin

我希望能够在使用Codeception时在Gherkin功能文件中使用PhpStorm的“Go To Declaration”功能(Mac上的 Command + B )。但是,PhpStorm似乎没有弄清楚步骤的定义,并输出此警告:

  

未定义的步骤参考:[...] Warning screenshot

当我使用Behat时,PhpStorm了解步骤的定义。

重现步骤

  1. mkdir codeception
  2. cd codeception
  3. composer require "codeception/codeception" --dev
  4. ./vendor/bin/codecept bootstrap
  5. ./vendor/bin/codecept generate:feature acceptance first
  6. 在PhpStorm中打开项目目录。
  7. 确保PhpStorm知道已安装Codeception:Codeception PhpStorm configuration
  8. 确保已安装PhpStorm插件 Gherkin Codeception Framework
  9. tests/acceptance/first.feature添加一个步骤。
  10. ./vendor/bin/codecept gherkin:snippets acceptance
  11. 这导致以下代码。 (并非所有内容都包括在内 - 如果我需要添加任何内容,请告诉我。)

    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()的位置。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:4)

尚不支持,请投票: https://youtrack.jetbrains.com/issue/WI-34963

答案 1 :(得分:4)

目前PhpStorm似乎使用Be​​hat Context接口来确定哪些类定义 .feature 文件中Gherkin步骤的实现,因此让PhpStorm找到代码测试测试程序中的步骤的解决方法是添加源树中某处的Behat\Behat\Context\Context接口

/* Context.php */
namespace Behat\Behat\Context;

interface Context { }

然后让AcceptanceTester实现该接口(这是一个空标记接口)

class AcceptanceTester extends \Codeception\Actor implements Context ...

答案 2 :(得分:2)

建立Roverwolf's答案。

将其添加到AcceptanceTester文件的顶部。

namespace Behat\Behat\Context { 
   interface Context { } 
}

然后让AcceptanceTester实现它。像这样包装命名空间是PHP测试中常见的技巧,可以伪造其他命名空间中存在的方法。

namespace {
    class AcceptanceTester extends \Codeception\Actor implements \Behat\Behat\Context\Context
    }
}

答案 3 :(得分:0)

我还有另一个步骤定义文件,并且使用Behat的上下文。然后在类声明中实现Context。

use Behat\Behat\Context;

class myClassSteps implements Context\Context
{
     step definitions
}

对我有用。