如何正确地将 StepObject 从 Cept 复制到 Cest

How to properly replicate StepObject from Cept to Cest

考虑以下 StepObject:

namespace Step\Acceptance;

class UserStep extends \AcceptanceTester
{
    public function login()
    {
        $I = $this;
        $I->amOnPage('/user/login');
        $I->fillField('username', 'user');
        $I->fillField('password', '123456');
        $I->click('Login');
    }
}

现在我要在 Cept 中使用它:

use Step\Acceptance\UserStep;

$I = new UserStep($scenario);
$I->login();
// change e-mail
// change password
// change profile
// etc
// log out

在上述情况下,用户将登录一次并尝试完成所有列出的任务。

现在,我将在 Cest 中使用相同的原理:

class UserCest 
{    
    function changeEmail(\Step\Acceptance\UserStep $I)
    {
        $I->login();
        // task        
    }

    function changePassword(\Step\Acceptance\UserStep $I)
    {
        $I->login();
        // task        
    }

    function changeProfile(\Step\Acceptance\UserStep $I)
    {
        $I->login();
        // task        
    }

    function logout(\Step\Acceptance\UserStep $I)
    {
        $I->login();
        // task        
    }
}

当我 运行 测试用户实际登录 4 次 时,现在使用 Cest。如果我使用 @before@depends 注释以及使用 _before().

时也会发生这种情况

有没有办法在使用 Cest 时 运行 login() 步骤对象 一次 持久化?

我觉得写初试

function login(\Step\Acceptance\UserStep $I) {
    $I->login();
}

并让其他人依赖它

/**
 * @depends login
 */
function changeEmail(\Step\Acceptance\UserStep $I)
{
    $I->login();
    // task        
}

应该做。

StepObject 应更改为以下内容:

public function login()
{
    $I = $this;

    if ($I->loadSessionSnapshot('login')) return;

    $I->amOnPage('/user/login');
    $I->fillField('username', 'user');
    $I->fillField('password', '123456');
    $I->click('Login');

    $I->saveSessionSnapshot('login');
}

这不仅会持久化 运行 步骤对象仅一次,而且还带来了在控制台输出中仅显示一次登录步骤的便利。

另一个很大的便利是能够正确地利用 @before 注释。

例如,您可以从 BaseCest 调用登录步骤,这样您现在可以在所有 Cest 中登录,并且您可以在任何地方方便地使用 @before login