unit-testing - cakephp testing
La prueba de unidad de CakePHP no reconoce los accesorios (1)
Estoy en CakePHP v3.x con phpunit v5.1.3. y mi prueba de unidad no parece reconocer la existencia de mis accesorios. Parece que las pruebas están leyendo desde la conexión de base de datos local ( default
).
Aquí está mi clase TestCase:
namespace App/Test/TestCase/Model/Table;
use Cake/Datasource/ConnectionManager;
use Cake/I18n/Time;
use Cake/ORM/TableRegistry;
use Cake/TestSuite/TestCase;
/**
* App/Model/Table/ScreensTable Test Case
*
* @property /App/Model/Table/ScreensTable ScreensTable
*/
class ScreensTableTest extends TestCase
{
/**
* Fixtures
*
* @var array
*/
public $fixtures = [
''app.screens''
];
/**
* setUp method
*
* @return void
*/
public function setUp()
{
parent::setUp();
$config = TableRegistry::exists(''Screens'') ? [] : [''className'' => ''App/Model/Table/ScreensTable''];
$this->Screens = TableRegistry::get(''Screens'', $config);
}
public testSomethingHere(){
$newScreen = $this->Screens->newEntity([''who'' => ''cares'']);
$screen = $this->Screens->save($newScreen);
// ^ This record will show up in my app''s DB!
}
Aquí está mi archivo de fijación:
<?php
namespace App/Test/Fixture;
use App/TestSuite/Fixture/TestFixture;
/**
* ScreensFixture
*
*/
class ScreensFixture extends TestFixture
{
/**
* Records
*
* @var array
*/
public $records = [
[
''id'' => 2,
''name'' => ''Bla bla'',
],
...
Cuando debug()
el valor devuelto de $this->Screens->find(''all'')->order([''id''=>''ASC''])->first()
Veo el primer registro REAL en el DB. No es mi accesorio.
¿Qué me estoy perdiendo?
ACTUALIZACIÓN1: Aquí están las conexiones definidas en mi archivo de configuración:
''Datasources'' => [
''default'' => [
''className'' => ''Cake/Database/Connection'',
''driver'' => ''Cake/Database/Driver/Postgres'',
''persistent'' => false,
''host'' => ''localhost'',
''port'' => ''5432'',
''username'' => ''postgres'',
''password'' => ''postgres'',
''database'' => ''transitscreen'',
''encoding'' => ''utf8'',
''timezone'' => ''UTC'',
''cacheMetadata'' => true,
''quoteIdentifiers'' => false,
],
/**
* Used by test suites
*/
''test'' => [
''className'' => ''Cake/Database/Connection'',
''driver'' => ''Cake/Database/Driver/Postgres'',
''persistent'' => false,
''host'' => ''localhost'',
''port'' => ''5432'',
''username'' => ''postgres'',
''password'' => ''postgres'',
''database'' => ''ts_test'',
''encoding'' => ''utf8'',
''timezone'' => ''UTC'',
''cacheMetadata'' => true,
''quoteIdentifiers'' => false,
],
],
Actualizar
Los contenidos de App/Test/Fixture
(No creo que haya nada interesante pasando aquí ... Creo que es solo ampliar la clase de accesorio Cake)
<?php
namespace App/TestSuite/Fixture;
use Cake/I18n/Time;
use Cake/TestSuite/Fixture/TestFixture as CoreTestFixture;
/**
* Override core TestFixture.
*/
class TestFixture extends CoreTestFixture
{
/**
* Initialize the fixture.
*
* @return void
* @throws /Cake/ORM/Exception/MissingTableClassException When importing from a table that does not exist.
*/
public function init()
{
$this->setRecordTimestamps();
$this->encodeJsonColumns();
parent::init();
}
/**
* Set record timestamps.
*
* - created
* - modified
*
* @return void
*/
public function setRecordTimestamps()
{
foreach ([''created'', ''modified''] as $timestampField) {
if (array_key_exists($timestampField, $this->fields)) {
foreach ($this->records as &$record) {
$record[$timestampField] = new Time();
}
}
}
}
/**
* Encode JSON columns.
*
* Bake will output JSON fields as arrays (because of the `JsonType` object mapped to this field) but since
* migrations execute directly against the database we need to encode these fields manually before insertion.
*
* @return void
*/
public function encodeJsonColumns()
{
$fixtureName = namespaceSplit(get_called_class())[1];
if ($fixtureName === ''DatasourcesFixture'' && array_key_exists(''widget_options'', $this->fields)) {
foreach ($this->records as &$record) {
$record[''widget_options''] = json_encode($record[''widget_options'']);
}
}
}
}
¿Has intentado reducir el alcance del problema al:
- Eliminar la herencia con App / Test / Fixture
- Definir el esquema de Fixture declarando la propiedad
$fields
. - Habilitar el registro de consultas
Ambas serían medidas temporales para tratar de simplificar el problema. También es posible que desee utilizar el indicador --debug
cuando se ejecuta PHPUnit. Esto hará que CakePHP genere todos los SQL utilizados para crear luminarias.