如何正确地将 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
。
考虑以下 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
。