【问题标题】:Codeception injection fails using page objectCodeception 注入使用页面对象失败
【发布时间】:2016-01-01 12:43:01
【问题描述】:

我是 Codeception 的新手,但在注入页面对象时遇到了问题。当我将以下构造逻辑添加到我的页面对象时,就会出现问题。

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

...我从这里的登录页面对象示例中得到这个:http://codeception.com/docs/06-ReusingTestCode#PageObjects

我得到的错误是:

[代码接收\异常\注入异常] 无法在“MyCest”实例中注入依赖项。无法创建“页面\登录”的实例。未能创建“AcceptanceTester”的实例。无法创建“Codeception\Scenario”的实例。无法解析依赖项“Codeception\TestCase”。

这就是我在 Cest 中注入页面的方式。

protected function _inject(\Page\Login $login) {
  $this->login_page = $login;
}

如果我删除 __construct 代码,错误就会消失。这是 Codeception 中的错误还是我做错了什么?

这是我找到的解决方法...

use \AcceptanceTester;
use Page\Login as LoginPage;

class MyCest {
    protected $login_page;
    public function _before(AcceptanceTester $I) {
      $this->login_page = new LoginPage($I);
    }
}

【问题讨论】:

    标签: dependency-injection codeception


    【解决方案1】:

    这是预期的行为。

    您的 LoginPage 构造函数不应有任何要在 DI 期间实例化的参数,因此您的解决方法是使用 AcceptanceTester 实例初始化 LoginPage 实例的正确方法。

    当您将 AcceptanceTester 指定为 LoginPage 的 ctor arg 时,Codeception 的 DI 机制会尝试通过以下方式递归解决依赖关系:

    LoginPage(AcceptanceTester) -> AcceptanceTester(Scenario) -> Scenario(TestCase) -> TestCase
    

    但是TestCase是抽象类所以不能实例化。

    【讨论】:

    • 感谢您的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 2017-10-12
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多