我想在大多数测试之前保留或运行登录。但是如果我尝试将登录代码移到_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);
}
}
发布于 2014-08-28 19:04:00
我认为公认的答案是实现它的一种方式,但不是最好的。这样做,当您只需要共享用户会话时,您将始终必须重新执行登录到系统的所有步骤。我认为抓取会话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也可能会对你有所帮助,因为自写这个答案以来,协同欺骗的框架已经发展起来。
发布于 2019-04-09 23:43:36
现在,多亏了saveSessionSnapshot和loadSessionSnapshot方法,Codeception才能解决这个问题。
<?php
// inside AcceptanceTester class:
public function login()
{
// if snapshot exists - skipping login
if ($I->loadSessionSnapshot('login')) return;
// logging in
$I->amOnPage('/login');
$I->fillField('name', 'jon');
$I->fillField('password', '123345');
$I->click('Login');
// saving snapshot
$I->saveSessionSnapshot('login');
}
?>
然后在你的测试类中,你可以像这样做
public function _before(AcceptanceTester $I)
{
$I->login();
}
发布于 2014-01-04 09:17:01
<?php
use \WebGuy;
class ProductCest
{
private $product_id = '1';
public function _before()
{
}
public function _after()
{
}
private function executeLogin(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);
return $I;
}
// tests
public function login(WebGuy $I) {
$I = $this->executeLogin($I);
$I->seeInCurrentUrl('/account');
}
/**
* @depends login
*/
public function chooseProduct(WebGuy $I) {
$I = $this->executeLogin($I);
$I->wantTo('go to products and choose one');
$I->amOnPage('/?product=' . $this->client_id);
}
}
这应该是可行的。
https://stackoverflow.com/questions/20333240
复制相似问题