我想在大多数测试之前保留或运行登录。但是,如果我尝试将登录代码移动到 _before 它不起作用,因为我没有可用的 webguy 实例。
在多个测试之间保持会话的最佳方法是什么?到目前为止,这是我的代码,很高兴得到一些帮助。我用谷歌搜索并检查了文档,但我找不到任何关于会话的东西。
<?php
use \WebGuy;
class ProductCest
{
private $product_id = '1';
public function _before()
{
}
public function _after()
{
}
// tests
public function login(WebGuy $I) {
$I->seeInCurrentUrl('/auth/login');
$I->fillField("//input[@type='email']", "username@email.com");
$I->fillField("//input[@type='password']", "1234");
$I->click('#signIn .submit');
$I->wait(500);
$I->seeInCurrentUrl('/account');
}
/**
* @depends login
*/
public function chooseProduct(WebGuy $I) {
$I->wantTo('go to products and choose one');
$I->amOnPage('/?product=' . $this->client_id);
}
}
我认为接受的答案是实现它的一种方式,但不是最好的。当你只需要共享用户会话时,这样做你将始终必须重现登录系统的所有步骤。我认为获取会话 cookie 并通过所需的用户记录测试传递它会更好。为此,你创建一个登录函数,获取 cookie,并使你的测试首先取决于登录测试:
<?php
use \AcceptanceTester;
class testingCest
{
private $cookie = null;
public function _before(AcceptanceTester $I)
{
}
public function _after(AcceptanceTester $I)
{
}
// tests
public function login(AcceptanceTester $I)
{
$I->wantTo('entrar al sistema');
$I->amOnPage('/');
$I->seeInCurrentUrl('/admin/login');
$I->fillField('user','perry');
$I->fillField('pass','pass-perry');
$I->click('Login');
$I->see('You\'re logged!');
$this->cookie = $I->grabCookie('your-session-cookie-name');
}
/**
* @depends login
*/
public function listUsers(AcceptanceTester $I)
{
$I->setCookie( 'your-session-cookie-name', $this->cookie );
$I->amOnPage('/admin/users');
$I->seeInCurrentUrl('/admin/users/1');
}
/**
* @depends login
*/
public function listRols(AcceptanceTester $I)
{
$I->setCookie( 'your-session-cookie-name', $this->cookie );
$I->amOnPage('/admin/rols');
$I->seeInCurrentUrl('/admin/rols/1');
}
}
这样,如果登录测试失败,你将无法获得 cookie,也不会通过其他测试。
我更喜欢这个@depends
注释而不是@before
其他答案中建议的注释,因为如果你使用,@depends
你将始终在测试之前执行代码,并且测试只会在登录后执行。
下面还有另一个答案,https ://stackoverflow.com/a/41109855/1168804 也可能对你有所帮助,因为自撰写此答案以来 Codeception 的框架已经发展。
我认为这应该是可以接受的答案,因为它要快得多
这要简单得多。谢谢。
现在,我有很多不同的 cepts - 我如何在多个 cepts 上共享一次登录?我为每个“财产”及其大约 40 个可以管理的不同财产分配了 1 个 Cept。这意味着如果我运行完整的套件,我仍然需要登录 40 次。
@RobQuist,您修改登录名并将cookie 存储在会话变量中,该会话变量将在进行整个登录之前进行检查。如果var在那里,就跳过登录,如果没有,去登录。然后,您应该在不同的概念之间共享登录方法:要么创建一个父类,要么在您的类中使用带有登录方法的特征(php.net/manual/en/language.oop5.traits.php)。
Chococroc - 我在这里更好地解释了我的问题;github.com/Codeception/Codeception/issues/2693你介意看看吗?