微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Codeception项目找不到AcceptanceTester

如何解决Codeception项目找不到AcceptanceTester

我正在 Mac Catalina 10.15 上使用 PHP v7.3.27 和 composer v2.0.12 从头开始​​创建一个新项目。我之前创建了一个 Codeception 项目,但在另一台计算机上。我遵循了使用验收测试的快速入门指南。

我使用“PHP vendor/bin/codecept generate:pageobject Acceptance”生成页面对象,并使用“PHP vendor/bin/codecept generate:cest Acceptance”生成Cests

当我尝试运行任何测试时,它说找不到该类。如果我将鼠标悬停在我的页面或 AcceptanceTester 一词上,它不会将我链接到任何内容。我的项目如下所示:

tests
   > data
   > output
   v support
     v _generated
       AcceptanceTesteractions.PHP
       FunctionalTesteractions.PHP
       UnitTesteractions.PHP
   > Helper
   > Page/Acceptance
      CustomerSignupHomePage.PHP
    AcceptanceTester.PHP
    FunctionalTester.PHP
    UnitTester.PHP
   v acceptance
      CustomerSignupCest.PHP

我意识到我的主目录中没有 .bashrc,所以我创建了一个并更新了 bash_profile,类似于我在工作计算机上的内容

#Global composer bin

export $PATH=~/.composer/vendor/bin:$PATH
export $PATH="$HOME/.composer/vendor/bin:$PATH"

cat .bash_profile
#alias composer="PHP /usr/local/bin/composer.phar"
  
export PATH="./composer/vendor/bin/:$PATH"

export PATH="/usr/local/opt/PHP@7.3/bin:$PATH"
export PATH="/usr/local/opt/PHP@7.3/sbin:$PATH"
~                                                  

我的 codeception.yml 看起来像这样:

    tests: tests
    output: tests/_output
    data: tests/_data
    support: tests/_support
    envs: tests/_envs
actor_suffix: Tester
extensions:
    enabled:
        - Codeception\Extension\RunFailed

我的 composer.json 看起来像这样:

    "require-dev": {
        "codeception/codeception": "^4.1","codeception/module-PHPbrowser": "^1.0.0","codeception/module-asserts": "^1.0.0"
    },"require":{
        "ext-zip": "*","guzzlehttp/guzzle": "^7.2","vlucas/PHPdotenv": "^5.2"
    },"autoload": {
        "psr-4": {
            "Tests\\Support\\": "tests/_support/"
        }
    }
}

我的一个 Cest 文件如下所示:


use Tests\Support\Page\Acceptance\CustomerSignupHomePage;

class CustomerSignupCest
{

    const ADDRESS = "100 Silmarillion Trail,Austin TX 78739";
    const NAME = "POC Automation Tester";
    const PHONE = "512-203-5555";

    /**
     * signUp
     *
     * @param AcceptanceTester $I
     * @return void
     */
    public function signUp(AcceptanceTester $I)
    {
        $I->wantToTest("the signup flow");
        CustomerSignupHomePage::fillGetQuickAndEasyPrice($I,self::ADDRESS,self::NAME,self::PHONE);
    }
}

我的页面类如下所示:


namespace Tests\Support\Page\Acceptance;

class CustomerSignupHomePage
{
    // include url of current page
    public static $URL = 'https://dev-www.<mycompany>.com';

    /**
     * Declare UI map for this page here. CSS or XPath allowed.
     * public static $usernameField = '#username';
     * public static $formSubmitButton = "#mainForm input[type=submit]";
     */
    const ADDRESS_INPUT = "#streetAddress";
    const SEE_PRICE_BUTTON = ".js-submitButton";
    const NAME_INPUT = ".js-fullNameInput";
    const PHONE_INPUT = ".js-phoneInput";
    
    /**
     * fillGetQuickAndEasyPrice
     *
     * @param AcceptanceTester $I
     * @param mixed $address
     * @param mixed $name
     * @param mixed $phone
     * @return void
     */
    public static function fillGetQuickAndEasyPrice(AcceptanceTester $I,$address,$name,$phone)
    {
        $I->waitForElement(self::ADDRESS_INPUT);
        $I->fillField(self::ADDRESS_INPUT,$address);
        $I->click(self::SEE_PRICE_BUTTON);
        $I->fillField(self::NAME_INPUT,$name);
        $I->fillField(self::PHONE_INPUT,$phone);
        $I->click(self::SEE_PRICE_BUTTON);
    }

    /**
     * Basic route example for your current URL
     * You can append any additional parameter to URL
     * and use it in tests like: Page\Edit::route('/123-post');
     */
    public static function route($param)
    {
        return static::$URL.$param;
    }

    /**
     * @var \AcceptanceTester;
     */
    protected $acceptanceTester;

    public function __construct(\AcceptanceTester $I)
    {
        $this->acceptanceTester = $I;
    }

}

如果我尝试运行测试,我会收到此错误

[TypeError] Argument 1 passed to Tests\Support\Page\Acceptance\CustomerSignupHomePage::fillGetQuickAndEasyPrice() must be an instance of Tests\Support\Page\Acceptance\AcceptanceTester,instance of AcceptanceTester given,called in /Users/julie/workspaces/Codeception-Demo/tests/acceptance/CustomerSignupCest.PHP on line 21
 

我的 AcceptanceTester.PHP 是 codeception 自动生成的:



/**
 * 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 void pause()
 *
 * @SuppressWarnings(PHPMD)
*/
class AcceptanceTester extends \Codeception\Actor
{
    use _generated\AcceptanceTesteractions;

    /**
     * Define custom actions here
     */
}

我的 Cest 文件页面文件根本看不到 AutomationTester。如果我开始输入 $I-> 它看不到任何代码接收方法。我已将 Codeception 市场扩展添加到 Vscode。如果我将鼠标悬停在我的方法参数中的 AcceptanceTester 上,它不会将我带到类文件。如果我将鼠标悬停在页面上,它不会将我带到页面对象文件。这就像我在盲目飞行。错误发生在 vscode 中和终端中的 vscode 之外。

我试过了:

  • 在类名上方或下方添加“use AcceptanceTester”并使用相对路径/绝对路径,不起作用
  • 重新启动 vscode
  • 运行构建命令
  • 尝试扩展 AcceptanceTester(不起作用)
  • 谷歌搜索并查看其他 SO 答案
  • 页面删除命名空间(更糟,说页面未找到)
  • 注释掉对页面对象的调用并使用 var_dump("hello world")- 使测试通过,但显然测试什么也不做
  • 意识到我也有 zshell,但也没有 .zshrc,所以尝试了与 bash 相同的命令。还获取了 bash 配置文件
  • 运行自动转储命令
  • 尝试准确遵循错误消息并将 AcceptanceTester 文件移动到 /Page/Acceptance 文件夹中,但是当我运行测试时,错误更改为“套件文件夹中不存在 AcceptanceTester 类。运行‘build’命令生成它”如果我运行构建,那么它会将 AcceptanceTester.PHP 放回原来的位置!
  • 按照带有引导程序说明的快速入门文档,完成我的整个项目并重新开始,没有页面文件,只有单个类文件。 Cest 仍然没有看到 AcceptanceTester $I 与 AcceptanceTester.PHP 相关并说“调用未定义的方法 AcceptanceTester::waitForElement”。重试了上面的步骤,但没有成功。
  • 将所有内容推送到 git,然后在工作计算机上关闭并得到完全不同的错误:“/Users/julielaursen/git/Codeception-Demo/tests/functional/”目录不存在。我还没有为功能而设置项目,而是为了接受。

解决方法

您需要在方法签名中的 AcceptanceTester 类名前指定反斜杠才能在根命名空间中查找类:

public function signUp(\AcceptanceTester $I)

public static function fillGetQuickAndEasyPrice(\AcceptanceTester $I,$address,$name,$phone)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?