Задать вопрос
@DimkaI
Системный адинистратор, разработчик ПО

Почему не находится запись в базе данных при проведении теста?

Пишу тест для проверки записи в БД.

unit.suite.yml

# Codeception Test Suite Configuration

class_name: UnitTester
modules:
    enabled:
      - Asserts
      - Yii2:
            part: [orm, email, fixtures]
      - Db
            populate: true
            cleanup: true
            reconnect: true
    config:
        Db:
            dsn: 'pgsql:host=localhost;dbname=mybase'
            user: 'myuser'
            password: 'correctPassword'

TypesTest.php

<?php
namespace tests\unit\models;
use app\models\Types;

class TypesTest extends \Codeception\Test\Unit
{
    /**
     * @var \UnitTester
     */
    protected $tester;

    protected function _before()
    {
    }

    protected function _after()
    {
    }

    // tests
    public function testEnterType()
    {
        $types = new Types();

        // Пустое значение недопустимо
        $types->name = NULL;
        $this->assertFalse($types->validate(['name']));

        // Больше 100 символов недопустимо
        $types->name = '**** aaaaabbbbbcccccdddddeeeeefffffggggghhhhhiiiiijjjjjkkkkklllllmmmmmnnnnnooooopppppqqqqqrrrrrsssss ****';
        $this->assertFalse($types->validate(['name']));

        $validName = '--TEST TYPE--';
        // Допустимая комбинация
        $types->name = $validName;
        $this->assertTrue($types->validate(['name']));

        // Сохранение данных в базу
        $this->assertTrue($types->validate());
        $this->assertTrue($types->save());
        $this->assertGreaterThan(0, $types->id);
        $this->tester->seeInDatabase('types', ['name' => $validName ]);
    }
}


В процессе проведения теста, происходит отказ на последней строке:
Codeception PHP Testing Framework v4.1.6
Powered by PHPUnit 8.5.8 by Sebastian Bergmann and contributors.
Running with seed:

Unit Tests (1) -----------------------------
✖ TypesTest: Enter type (0.03s)
---------------------------------------------

Time: 90 ms, Memory: 12.00 MB
There was 1 failure:

---------
1) TypesTest: Enter type
 Test  tests/unit/models/TypesTest.php:testEnterType
No matching records found for criteria {"name":"--TEST TYPE--"} in table types
Failed asserting that 0 is greater than 0.
#1  Codeception\Module\Db->seeInDatabase
#2  /var/www/basic/tests/_support/_generated/UnitTesterActions.php:1397
#3  /var/www/basic/tests/unit/models/TypesTest.php:48

FAILURES!
Tests: 1, Assertions: 7, Failures: 1.

При этом в предыдущей строке отказа не произошло, и присвоен id, больше 0, а значит произошла запись в базу данные, но при попытке проверить на наличие записи, сообщает, что такой записи нет.

Что я неправильно настроил и как исправить, чтобы последняя проверка успешно завершалась?
  • Вопрос задан
  • 243 просмотра
Подписаться 1 Простой 2 комментария
Решения вопроса 2
@Pavlvdv
В конфигурацию Yii2 добавьте transaction: false (https://codeception.com/for/yii)
Ответ написан
Комментировать
@DimkaI Автор вопроса
Системный адинистратор, разработчик ПО
Эх, видимо мой вопрос не такой уж и простой.
Удивительно, но следующие строки показывают, что запись в базе данных появилась:
$count = count(Types::find()->where([ 'name' => $validName ])->all());
$this->assertGreaterThan(0, $count);
$this->assertEquals(1, $count);

То есть найдена одна запись. А следующая команда её не находит:
$this->tester->seeInDatabase('types', [ 'name' => $validName ]);

Такое впечатление, что взаимодействие происходит с разными слепками базы данных.
И, действительно, код из теста:
$this->tester->haveInDatabase('types', [ 'name' => $validName ]);

после выполнения теста, в рабочую базу добавляет запись, чего тесты в принципе делать не должны.

Вопрос остаётся открытым, как правильно написать конфиг, чтобы результат теста искался в слепке базы для тестов, а не в реальной?
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы