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

时间:2015-07-08 17:25:07

标签: php codeception

考虑以下StepObject:

str

现在我将在Cept中使用它:

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');
    }
}

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

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

use Step\Acceptance\UserStep;

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

现在,当我运行测试时,使用Cest,用户实际上会 4次。如果我使用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 } } @before注释以及使用@depends时也会发生这种情况。

在使用Cest时,有没有办法保留并运行_before()步骤对象一次

2 个答案:

答案 0 :(得分:0)

我认为写第一个测试

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

并让其他人依赖它

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

应该这样做。

答案 1 :(得分:0)

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 调用登录步骤,因此现在可以在所有Cests中使用登录,并且您可以方便地在任何地方使用@before login