Я пытался провести модельные тесты с помощью фикстур, но я не могу загрузить записи в фикстуры.
Я использую MySQL, у меня есть отдельная схема с именем test_booking
, в котором есть пустые таблицы, соответствующие производственной базе данных. Я запек файл приспособления и модели с помощью:
cake bake fixture Status
и
cake bake test table Status
, что дало файлы ниже.
<?php
declare(strict_types=1);
namespace App\Test\Fixture;
use Cake\TestSuite\Fixture\TestFixture;
/**
* StatusFixture
*/
class StatusFixture extends TestFixture
{
/**
* Fields
*
* @var array
*/
// phpcs:disable
public $fields = [
'id' => ['type' => 'integer', 'length' => null, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null],
'type' => ['type' => 'string', 'length' => 45, 'null' => false, 'default' => null, 'collate' => 'latin1_swedish_ci', 'comment' => '', 'precision' => null],
'date' => ['type' => 'string', 'length' => 45, 'null' => false, 'default' => null, 'collate' => 'latin1_swedish_ci', 'comment' => '', 'precision' => null],
'start_time' => ['type' => 'string', 'length' => 5, 'null' => false, 'default' => '', 'collate' => 'latin1_swedish_ci', 'comment' => '', 'precision' => null],
'service_id' => ['type' => 'integer', 'length' => null, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
'date_created' => ['type' => 'timestamp', 'length' => null, 'precision' => null, 'null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => ''],
'date_modified' => ['type' => 'timestamp', 'length' => null, 'precision' => null, 'null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => ''],
'manned_by' => ['type' => 'integer', 'length' => null, 'unsigned' => false, 'null' => true, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
'text' => ['type' => 'string', 'length' => 10000, 'null' => false, 'default' => '', 'collate' => 'latin1_swedish_ci', 'comment' => '', 'precision' => null],
'active' => ['type' => 'boolean', 'length' => null, 'null' => false, 'default' => '1', 'comment' => '', 'precision' => null],
'_constraints' => [
'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
],
'_options' => [
'engine' => 'InnoDB',
'collation' => 'latin1_swedish_ci'
],
];
// phpcs:enable
/**
* Init method
*
* @return void
*/
public function init(): void
{
$this->records = [
[
'id' => 1,
'type' => 'Lorem ipsum dolor sit amet',
'date' => 'Lorem ipsum dolor sit amet',
'start_time' => 'Lor',
'service_id' => 1,
'date_created' => 1590634027,
'date_modified' => 1590634027,
'manned_by' => 1,
'text' => 'Lorem ipsum dolor sit amet',
'active' => 1,
],
];
parent::init();
}
}
<?php
declare(strict_types=1);
namespace App\Test\TestCase\Model\Table;
use App\Model\Table\StatusTable;
use Cake\Datasource\ConnectionManager;
use Cake\ORM\TableRegistry;
use Cake\TestSuite\TestCase;
/**
* App\Model\Table\StatusTable Test Case
*/
class StatusTableTest extends TestCase
{
/**
* Test subject
*
* @var \App\Model\Table\StatusTable
*/
protected $Status;
/**
* Fixtures
*
* @var array
*/
protected $fixtures = [
'app.Status',
];
/**
* setUp method
*
* @return void
*/
public function setUp(): void
{
parent::setUp();
$config = TableRegistry::getTableLocator()->exists('Status') ? [] : ['className' => StatusTable::class];
$this->Status = TableRegistry::getTableLocator()->get('Status', $config);
}
/**
* tearDown method
*
* @return void
*/
public function tearDown(): void
{
unset($this->Status);
parent::tearDown();
}
/**
* Test getStatus method
*
* @return void
*/
public function testGetStatus(): void
{
$status = $this->Status->getStatus(1);
print_r($status);
exit;
$this->markTestIncomplete('Not implemented yet.');
}
}
Но работает тесты, выполняющие testGetStatus (), возвращают пустой массив вместо записи, указанной в фикстуре. Что я делаю не так?
Редактировать # 1: phpunit. xml .dist:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
colors="true"
processIsolation="false"
stopOnFailure="false"
bootstrap="tests/bootstrap.php"
>
<php>
<ini name="memory_limit" value="-1"/>
<ini name="apc.enable_cli" value="1"/>
</php>
<!-- Add any additional test suites you want to run here -->
<testsuites>
<testsuite name="app">
<directory>tests/TestCase/</directory>
</testsuite>
<!-- Add plugin test suites here. -->
</testsuites>
<!-- Setup a listener for fixtures -->
<listeners>
<listener class="Cake\TestSuite\Fixture\FixtureInjector">
<arguments>
<object class="Cake\TestSuite\Fixture\FixtureManager"/>
</arguments>
</listener>
</listeners>
<!-- Ignore vendor tests in code coverage reports -->
<filter>
<whitelist>
<directory suffix=".php">src/</directory>
<directory suffix=".php">plugins/*/src/</directory>
<exclude>
<file>src/Console/Installer.php</file>
</exclude>
</whitelist>
</filter>
</phpunit>
Редактировать # 2: app_local. php:
'Datasources' => [
'default' => [
'datasource' => 'Cake\Database\Driver\Mysql',
'host' => '<ip prod>',
'username' => 'xxx',
'password' => 'xxx',
'database' => 'booking',
'schema' => 'booking',
],
'test' => [
'datasource' => 'Cake\Database\Driver\Mysql',
'host' => '<ip stage>',
'username' => 'xxx',
'password' => 'xxx',
'database' => 'test_booking',
'schema' => 'test_booking',
],
],
Редактировать # 3: команда CLI для запуска тестов:
vendor/bin/phpunit