Тесты Codeception используют источник данных «по умолчанию» вместо «test» в CakePHP 3. - PullRequest
0 голосов
/ 22 ноября 2018

Я могу запустить UnitTests через Codeception, но когда дело доходит до базы данных и исправляет ее путаницу ...

Мой codeception.dist.yml

namespace: App\TestSuite\Codeception
paths:
    tests: tests
    output: tmp/tests
    data: tests/Fixture
    support: src/TestSuite/Codeception
    envs: tests/Envs
settings:
    bootstrap: bootstrap.php
    colors: true
    memory_limit: 1024M
actor_suffix: Tester
extensions:
    enabled:
        - Codeception\Extension\RunFailed
modules:
    config:
        Db:
            dsn: 'mysql:host=%DB_HOST_TEST%;dbname=%DB_NAME_TEST%'
            user: '%DB_USER_TEST%'
            password: '%DB_PASSWORD_TEST%'
            dump: tests/_data/dump.sql
            cleanup: true # reload dump between tests
            populate: true # load dump before all tests
            reconnect: true
    enabled:
        - Db
params:
    - env

Дамп.sql импортируется в тестовую базу данных при запуске моих тестов.Приборы не вставляются ...

Затем в моем тесте я делаю что-то вроде этого (сокращенно):

<?php
namespace App\Test\Unit\Model\Behavior;

use App\Model\Behavior\HashableBehavior;
use App\Model\Entity\User;
use Cake\ORM\TableRegistry;
use Cake\Datasource\ConnectionManager;
use Cake\TestSuite\TestCase;

/**
 * App\Model\Behavior\HashableBehavior Test Case
 */
class HashableBehaviorTest extends \Codeception\Test\Unit
{
/**
 * Test subject
 *
 * @var \App\Model\Behavior\HashableBehavior
 */
public $Hashable;

public $fixtures = [
    'app.Users',
    'app.mandators'
];

/**
 * Test subject
 *
 * @var \App\Model\Table\UsersTable
 */
public $UsersTable;

/**
 * setUp method
 *
 * @return void
 */
public function setUp()
{
    parent::setUp();
    $config = TableRegistry::getTableLocator()->exists('Users') ? [] : ['className' => UsersTable::class];
    $this->UsersTable = TableRegistry::getTableLocator()->get('Users', $config);

    $this->Hashable = new HashableBehavior($this->UsersTable);
}

/**
 * tearDown method
 *
 * @return void
 */
public function tearDown()
{
    unset($this->Hashable);

    parent::tearDown();
}

/**
 * Test beforeSave method
 *
 * @return void
 * @throws \Exception
 */
public function testBeforeSave()
{
    $user = $this->UsersTable->get(1);
    ...

}

Это дает мне первую запись из моей базы данных по умолчанию, а не из тестабаза данных.Понятия не имею, чего здесь не хватает ... Рад любой помощи!

1 Ответ

0 голосов
/ 23 ноября 2018

После проверки всего кода снова я нашел в tests / bootstrap.php следующие строки:

if (getenv('db_dsn')) {
    putenv('DATABASE_URL=' . getenv('db_dsn'));
    putenv('DATABASE_TEST_URL=' . getenv('db_dsn'));
}

Даже я не смог найти место, где используется переменная DATABASE_TEST_URL, добавив это в мой файл .envрешил:

export db_dsn="mysql://db_usr:db_password@db_host/db_name?encoding=utf8&timezone=UTC&cacheMetadata=true&quoteIdentifiers=false&persistent=false"

Переменная DATABASE_TEST_URL находится в .env, но не влияет на это ... Я думаю, что cakePHP и Codeception магически не слишком хорошо интегрируются.

Все еще мои приборы не загружены в UnitTests (класс MyTest extends \ Codeception \ Test \ Unit) - но вопрос решен.

[ОБНОВЛЕНИЕ] Исправлена ​​загрузка прибора.Я должен вручную внедрить FixtureManager и загрузить свои результаты в функцию setUp.

...