Тестовая база данных Cakephp — Проблемы с моделью

У меня проблема с выполнением теста phpunit в моем проекте. Каким-то образом Organization модель не работает на $test базы данных, в то время как остальные модели работают. Я даже не знаю, добавляются ли данные организации в тестовую базу данных, потому что она всегда запрашивает default база данных.

Вот код:

Метод, который я тестирую:

public function guardarInformacion($usuario=null, $organizacion=null){
if($usuario==null || $organizacion==null):
throw new CakeException('Datos insuficientes');
endif;

$this->User->create();
$this->Organization->create();
Debugger::dump($this->Organization->find('all'));
if($this->User->save(array('User'=>$usuario))):
if(!$this->Organization->save(array('Organization'=>$organizacion))):
Debugger::dump($this->Organization->invalidFields());
$this->User->delete('last');
throw new CakeException('Ocurrio un problema al ingresar los datos');
endif;
endif;
}

Тестовый класс:

<?php
App::uses('OrganizationsController', 'Controller');
App::import('Controller', 'Organizations');
App::import('Model', 'Organization');

/**
* OrganizationsController Test Case
*
*/
class OrganizationsControllerTest extends ControllerTestCase {

/**
* Variable que contiene un controlador de organizacion
*/
public $OrganizationsController = null;

/**
* Variable que contiene un modelo de organizacion
*/
public $Organization = null;

/**
* Fixtures
*
* @var array
*/
public $fixtures = array(
'app.organization',
'app.city',
'app.departament',
'app.country',
'app.user'
);

/**
* Método que se ejecuta cada vez antes de que se ejecute
* un test
*
* @return void
*/
public function setUp(){
parent::setUp();
$this->OrganizationsController = new OrganizationsController();
$this->Organization = new Organization();
}

/**
* Test del método guardarInformacion
*
* @return void
*/
public function testGuardarInformacion(){
$user= array(
'id' => 10,
'password' => 'passwordTest',
'username' => 'usernameTest'
);

$organization = array(
'user_id' => 10,
'nit' => 'nitX',
'nombre' => 'nombreX',
'sigla' => 'siglaX',
'telefono' => 1,
'fax' => 'faxX',
'email' => '[email protected]',
'sitio_web' => 'sitio_webX',
'city_id' => 1,
'rep_nombres' => 'rep_nombresX',
'rep_primer_apellido' => 'rep_primer_apellidoX',
'rep_segundo_apellido' => 'rep_segundo_apellidoX',
'rep_tipo_documento' => 1,
'rep_direccion' => 'rep_direccionX',
'rep_telefono' => 'rep_telefonoX',
'rep_email' => 'rep_emailX',
'adm_nombres' => 'adm_nombresX',
'adm_primer_apellido' =>
'adm_primer_apellidoX',
'adm_segundo_apellido' => 'adm_segundo_apellidoX',
'adm_cargo' => 'adm_cargo1',
'adm_tipo_documento' => 1,
'adm_numero_documento' => 'adm_numero_documentoX',
'adm_telefono' => 'adm_telefonoX',
'adm_email' => 'adm_emailX',
'certificacion_codigo' =>
'certificacion_codigoX',
'certificacion_fecha' => '2014-11-03'
);

$this->OrganizationsController->guardarInformacion($user, $organization);
$aux = $this->Organization->findByUser_id('10');
Debugger::dump($aux);
$this->assertEquals('nombreX', $aux['Organization']['nombre']);
}

/**
* Método que se ejecuta desdepués de cada test
*
* @return void
*/
public function tearDown(){
parent::tearDown();
$this->OrganizationsController = null;
$this->Organization = null;
}
}

Светильник:

<?php
/**
* OrganizationFixture
*
*/
class OrganizationFixture extends CakeTestFixture {

/**
* Fields
*
* @var array
*/
public $fields = array(
'id' => array('type' => 'integer', 'null' => false, 'default' => null, 'unsigned' => false, 'key' => 'primary'),
'user_id' => array('type' => 'integer', 'null' => false, 'default' => null, 'unsigned' => false, 'key' => 'unique', 'comment' => 'Heredada, corresponde a los datos que hacen de organización un usuario del sistema.'),
'nit' => array('type' => 'string', 'null' => false, 'default' => null, 'length' => 11, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
'nombre' => array('type' => 'string', 'null' => false, 'default' => null, 'length' => 60, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
'sigla' => array('type' => 'string', 'null' => false, 'default' => null, 'length' => 10, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
'telefono' => array('type' => 'integer', 'null' => false, 'default' => null, 'unsigned' => false),
'fax' => array('type' => 'string', 'null' => false, 'default' => null, 'length' => 45, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
'email' => array('type' => 'string', 'null' => false, 'default' => null, 'length' => 45, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
'sitio_web' => array('type' => 'string', 'null' => false, 'default' => null, 'length' => 45, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
'city_id' => array('type' => 'integer', 'null' => false, 'default' => null, 'unsigned' => false, 'key' => 'index'),
'rep_nombres' => array('type' => 'string', 'null' => false, 'default' => null, 'length' => 45, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
'rep_primer_apellido' => array('type' => 'string', 'null' => false, 'default' => null, 'length' => 45, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
'rep_segundo_apellido' => array('type' => 'string', 'null' => false, 'default' => null, 'length' => 45, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
'rep_tipo_documento' => array('type' => 'integer', 'null' => false, 'default' => null, 'unsigned' => false),
'rep_direccion' => array('type' => 'string', 'null' => false, 'default' => null, 'length' => 45, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
'rep_telefono' => array('type' => 'string', 'null' => false, 'default' => null, 'length' => 45, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
'rep_email' => array('type' => 'string', 'null' => false, 'default' => null, 'length' => 45, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
'adm_nombres' => array('type' => 'string', 'null' => false, 'default' => null, 'length' => 45, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
'adm_primer_apellido' => array('type' => 'string', 'null' => false, 'default' => null, 'length' => 45, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
'adm_segundo_apellido' => array('type' => 'string', 'null' => false, 'default' => null, 'length' => 45, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
'adm_cargo' => array('type' => 'string', 'null' => false, 'default' => null, 'length' => 45, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
'adm_tipo_documento' => array('type' => 'integer', 'null' => false, 'default' => null, 'unsigned' => false),
'adm_numero_documento' => array('type' => 'string', 'null' => false, 'default' => null, 'length' => 45, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
'adm_telefono' => array('type' => 'string', 'null' => false, 'default' => null, 'length' => 45, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
'adm_email' => array('type' => 'string', 'null' => false, 'default' => null, 'length' => 45, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
'certificacion_codigo' => array('type' => 'string', 'null' => true, 'default' => null, 'length' => 45, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
'certificacion_fecha' => array('type' => 'date', 'null' => true, 'default' => null),
'indexes' => array(
'PRIMARY' => array('column' => 'id', 'unique' => 1),
'user_id_UNIQUE' => array('column' => 'user_id', 'unique' => 1),
'fk_organizations_users1_idx' => array('column' => 'user_id', 'unique' => 0),
'fk_organizations_cities1_idx' => array('column' => 'city_id', 'unique' => 0)
),
'tableParameters' => array('charset' => 'utf8', 'collate' => 'utf8_general_ci', 'engine' => 'InnoDB')
);

/**
* Records
*
* @var array
*/
public $records = array(
array(
'id' => 1,
'user_id' => 1,
'nit' => 'Lorem ips',
'nombre' => 'Lorem ipsum dolor sit amet',
'sigla' => 'Lorem ip',
'telefono' => 1,
'fax' => 'Lorem ipsum dolor sit amet',
'email' => '[email protected]',
'sitio_web' => 'Lorem ipsum dolor sit amet',
'city_id' => 1,
'rep_nombres' => 'Lorem ipsum dolor sit amet',
'rep_primer_apellido' => 'Lorem ipsum dolor sit amet',
'rep_segundo_apellido' => 'Lorem ipsum dolor sit amet',
'rep_tipo_documento' => 1,
'rep_direccion' => 'Lorem ipsum dolor sit amet',
'rep_telefono' => 'Lorem ipsum dolor sit amet',
'rep_email' => 'Lorem ipsum dolor sit amet',
'adm_nombres' => 'Lorem ipsum dolor sit amet',
'adm_primer_apellido' => 'Lorem ipsum dolor sit amet',
'adm_segundo_apellido' => 'Lorem ipsum dolor sit amet',
'adm_cargo' => 'Lorem ipsum dolor sit amet',
'adm_tipo_documento' => 1,
'adm_numero_documento' => 'Lorem ipsum dolor sit amet',
'adm_telefono' => 'Lorem ipsum dolor sit amet',
'adm_email' => 'Lorem ipsum dolor sit amet',
'certificacion_codigo' => 'Lorem ipsum dolor sit amet',
'certificacion_fecha' => '2014-11-04'
),
);

}

Базы данных:

public $default = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'root',
'password' => 'root',
'database' => 'colciencias'
);

public $test = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'root',
'password' => 'root',
'database' => 'colcienciastest'
);

И ошибка:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`colciencias`.`organizations`, CONSTRAINT `fk_organizations_users1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION)

Как вы можете видеть это использует colcienciasорганизации, а не «colcienciastest». «организации».

0

Решение

Я решил проблему, хотя не было ни исключений, ни предупреждений, у меня было две строки импорта:

App::import('Controller', 'Organizations');
App::import('Model', 'Organization');

Что не так, это не нарушало код и не исключение никогда не обнаруживалось. Просто удалив их, можно развернуть тест в нужном месте.

ОБНОВИТЬ:
Я не совсем уверен, сегодня я создаю еще один тестовый пример и только что получил ту же проблему, когда создавал модель, решение вызывало модель из контроллера, а не просто создавало его экземпляр:
$this->Controller->Model->function()

Я ничего не нашел и не знаю, неправильно ли импортировать и создавать модели ни в тестовом примере, ни где-либо еще.

ОБНОВЛЕНИЕ: Решение: Проблема всегда заключалась в том, что модели в Cakephp не могут быть созданы в new Model(); путь. В CakePHP вы должны создать новый класс, используя ClassRegistry следующим образом:

$model = ClassRegistry::init('ModelName');

Не использование этого способа вызова может даже привести к тому, что ваше программное обеспечение будет работать правильно, но однозначно, если вы его не используете, это вызовет проблемы, точно такие, как у меня.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]