测试数据库和代码

时间:2016-05-20 22:02:53

标签: laravel phpunit codeception

我正在使用Laravel 5 / Codeception。

我正在使用测试数据库。

这是我的配置:

acceptance.suite.yml:

class_name: AcceptanceTester
modules:
enabled:
    - WebDriver
    - \Helper\Acceptance
    - Db
    - Asserts

config:
    WebDriver:
        url: 'http://laravel.dev'
        browser: 'phantomjs'
        window_size: 1024x768
    Db:
        dsn: 'mysql:host=laravel.dev;dbname=kendo_test'
        user: 'homestead'
        password: 'secret'

所以,在这里我将我的数据库定义为我的测试数据库。

然后,在我的bootstrap.php中,我有:

$app->loadEnvironmentFrom('.env.testing');

和.env.testing:

DB_HOST=127.0.0.1
DB_DATABASE=kendo_test
DB_USERNAME=homestead
DB_PASSWORD=secret

作为测试,我将kendo_test更改为kendo_test2,但它失败了,它正在使用此数据库。

现在,当我执行验收测试时,我的测试失败,因为行插入主数据库,而不是测试,而且我不知道为什么......

这是我的测试:

public function it_create_user(\AcceptanceTester $I, $scenario)
{
    App::setLocale('en');
    $user = factory(User::class)->make();

    $I = new SimpleUser($scenario);
    $I->logAsUser();
    $I->dontSee(trans_choice('core.user', 2) . ' </a></li>');
    $I->logout();
    $I = new SuperAdmin($scenario);
    $I->logAsSuperAdmin();

    $I->click('#dropdown-user');
    $I->click(trans_choice('core.user', 2));
    $I->click(trans('core.addModel', ['currentModelName' => trans_choice('core.user', 1)]));
    $I->fillField('name',$user->name );
    $I->fillField('email',$user->email);
    $I->fillField('firstname',$user->firstname);
    $I->fillField('lastname',$user->lastname);
    $I->fillField('password','111111');
    $I->fillField('password_confirmation','111111');
    $I->click(trans('core.save')); // <-- Here is should save it
    $I->seeInCurrentUrl('/users');
    $I->seeInSource(trans('msg.user_create_successful'));
    $I->seeInDatabase('ken_users', ['name' => $user->name]);
}

任何想法为什么???

1 个答案:

答案 0 :(得分:1)

当您点击$I->click(trans('core.save'));时,它将从您的应用中使用.env而不是$app->loadEnvironmentFrom中的.env。

这是因为在运行验收测试时,您正通过浏览器与您的应用进行交互。

正在运行的测试有自己的实例,以及测试访问的应用程序。

此处使用$app->loadEnvironmentFrom的唯一原因是利用Eloquent,即使这样,它也必须在单独的连接上。