Не удается запустить Auth::loginUsingId(1) при принятии Codeception _bootstrap.php

Я использую Laravel и Codeception для приемочного тестирования. Большинство моих тестов требуют, чтобы пользователи вошли в систему, поэтому я хотел извлечь эти поведения в файл _bootstrap.php внутри папки принятия. Насколько я понимаю, это практика запуска установки перед тестами в Codeception.

Я могу подтвердить, что моя таблица пользователей существует (я просматриваю ее с помощью Navicat) и что существует пользователь с идентификатором 1. Codeception, насколько мне известно, правильно настроен для использования этой базы данных. Я также включил модули Laravel4 и Db для пакета принятия. Я получаю следующую ошибку, когда пытаюсь запустить свой пакет приемки или любую отдельную приемку Cept.

консоль:

[Illuminate\Database\QueryException]
SQLSTATE[42P01]: Undefined table: 7 ERROR:  relation "users" does not exist
LINE 1: select * from "users" where "id" = $1 limit 1
                      ^ (SQL: select * from "users" where "id" = 1 limit 1)

Я получаю эту ошибку независимо от содержимого любого из приемов. Даже простое $I->amOnPage('/') или $I->comment('test') по-прежнему приводит к ошибке. Я считаю, что ошибка возникает, как только она встречает команду в файле _bootstrap.php. Каким-то образом он может получить доступ к моей базе данных. Я должен отметить, что я также пробовал различные комбинации включения и отключения параметров заполнения и очистки для модулей Laravel4 и Db, но безрезультатно.

Вот мой файл acceptance/_bootstrap.php:

<?php

Auth::loginUsingId(1);

codeception.yml:

actor: Tester
paths:
    tests: tests
    log: tests/_output
    data: tests/_data
    helpers: tests/_support
settings:
    bootstrap: _bootstrap.php
    colors: true
    memory_limit: 1024M
modules:
    config:
        Db:
            dsn: 'pgsql:host=localhost;dbname=myapp'
            user: 'someuser'
            password: 'somepass'
            dump: tests/_data/dump.sql

acceptance.suite.yml:

class_name: AcceptanceTester
modules:
    enabled:
        - AcceptanceHelper
        - Laravel4
        - PhpBrowser
        - Db
    config:
        PhpBrowser:
            url: 'http://localhost'
        Laravel4:
            cleanup: false
        Db:
            populate: true
            cleanup: false

person andrewhl    schedule 22.06.2014    source источник


Ответы (1)


Во-первых, вы не должны использовать модуль Laravel4 для приемочных тестов Codeception. Это только для функциональных и модульных тестов. Дополнительную информацию по этому вопросу см. в этом ответе.

Чтобы ответить на ваш конкретный вопрос об автоматическом входе вашего пользователя в ваши приемочные тесты - вот как я это делаю:

/tests/_support/AcceptanceHelper.php

<?php
namespace Codeception\Module;
use \AcceptanceTester;

class AcceptanceHelper extends \Codeception\Module
{
    // This is my default user I use for all my tests
    public function loginUser(AcceptanceTester $i)
    {
        $this->login($i, '[email protected]', 'tester');
    }  

    // And this function lets me login a specific user if I need someone else
    public function login(AcceptanceTester $i, $email, $password)
    {
        $i->amOnPage('/login');
        $i->fillField('email', $email);
        $i->fillField('password', $password);
        $i->click('submit');
        $i->seeCurrentUrlEquals('/dashboard');
    }

    public function logoutUser(AcceptanceTester $i)
    {
        $i->amOnPage('/logout');
        $i->seeCurrentUrlEquals('/login');
        $i->see('You have been logged out');
    }
}

/tests/acceptance/ExampleCest.php

<?php
use \AcceptanceTester;

class ExampleCest
{
    public function _before(AcceptanceTester $i)
    {
        $i->loginUser($i);
    }


    public function tryToViewDashboard(AcceptanceTester $i)
    {   
        // User is logged in here 
        $i->amOnPage('/dashboard');
    }

    public function tryOtherExample(AcceptanceTester $i)
    {   
        // User is logged in here 
        $i->amOnPage('/dashboard');
    }

    public function tryMoreInfo(AcceptanceTester $i)
    {   
        // User is logged in here 
        $i->amOnPage('/dashboard');
    }
}

Примечание. Я использую $i в маленьком регистре вместо $I — мне легче печатать — поэтому вам может потребоваться изменить все $i на $I в вашем коде.

person Laurence    schedule 22.06.2014