0

I have a problem with while doing a phpunit test in my project. Somehow the Organization model is not working on the $test database, while the rest of the models do work. I don't even know if the fixtures of organization are being added at the test database because it always queries the default database.

Here is the code:

Method I am testing:

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;
}

The test class:

<?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;
        }
}

The fixture:

<?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'
        ),
    );

}

The databases:

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'
);

And the error:

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)

As you can see it is using colciencias.`organizations, and not 'colcienciastest'.'organizations'.

1 Answer 1

1

I solved the problem, even though not exception nor warning ever showed up, I had this 2 import lines:

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

Which are wrong, it did not break the code, and not exception ever showed up. Just removing them let to deploy the test in a right nay.

UPDATE: I am not really sure, I create another test case today and just got the same problem when I created a Model, solution was calling model from a controller and not just creating an instance of one: $this->Controller->Model->function()

I have not found anything about, nor really know if it is just wrong importing and creating models in a test case nor anywhere.

UPDATE: Solution: The problem always was in the fact that models in Cakephp cannot be created in the new Model(); way. In cakephp you have to create a new class using the ClassRegistry in the next way:

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

Not using this invocation way, could even get your software working right, but definitly not using it brings problems just like the one I had.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.