Warm tip: This article is reproduced from serverfault.com, please click

php-Codeception:保持登录状态

(php - Codeception: Keep a logged in state)

发布于 2013-12-02 16:37:46

我想在大多数测试之前保留或运行登录。但是,如果我尝试将登录代码移动到 _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);
    }

}
Questioner
Ms01
Viewed
0
Federico J. 2017-09-11 17:41:43

我认为接受的答案是实现它的一种方式,但不是最好的。当你只需要共享用户会话时,这样做你将始终必须重现登录系统的所有步骤。我认为获取会话 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 的框架已经发展。