unit-testing cakephp phpunit cakephp-3.0

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:

  1. Eliminar la herencia con App / Test / Fixture
  2. Definir el esquema de Fixture declarando la propiedad $fields .
  3. 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.