quarta-feira, 19 de outubro de 2011

Codeigniter 2 + Fixtures + Relacionamentos (parte 5)

Relacionamento entre Enrollment e Student

Começando step-by-step criar a um método na classe de teste StudentTest
para validar um lado do relacionamento.  Os outros métodos da classe foram omitidos e podem ser consultados no repositório do projeto.

<?php
include_once dirname(__FILE__) . '/../support/enviromment.php';

/**
 * @group models 
 */
class StudentTest extends CIUnit_TestCase
{

   // ..... 
    public function testShouldHaveManyEnrollments()
    {
        $student = Student::find(1);
        $this->assertEquals(2, count($student->enrollments));
    }

  // ....


Rodar os testes e ver o teste quebrar. 
$  phpunit --testdox --color models/StudentTest.php

Um estudante pode ter muitas matrículas durante sua vida acadêmica, uma para cada semestre. Para isso devemos especificar este relacionamento nos modelos envolvidos.
<?php
class Student extends Person {
    
    static $primary_key = 'id';
    static $has_many = array(array('enrollments'));

    public function __construct(array $attributes = array()) {
        parent::__construct(array_merge($attributes,array('type'=> __CLASS__ )));
    }
}

<?php
class Enrollment extends ActiveRecord\Model {
  
   static $belongs_to = array(
     array('student')
   );
}

Nosso teste ainda continuará falhando, agora precisamos fazer nosso método find() do ORM retornar dados para que o método de teste funcione.  Para isso temos duas estratégias que podemos utilizar nesse momento, criar um mock do método ou utilizar fixtures para popular a base de teste.  Vamos abordar as duas alternativas iniciando com as fixtures.

Inicie criando um arquivo que conterá os dados das pessoas em /tests/fixtures/people_fixt.yml.
1:
    name: 'Paola de Oliveira'
    type: 'Student'
2:
    name: 'Gabriela Duarte'
    type: 'Student'
3:
    name: 'Márcia Lima'
    type: 'Teacher'
4:
    name: 'Fernanda Montenegro'
    type: 'Teacher'
5:
    name: 'Virgin Stanford'
    type: NULL
E outro em /tests/fixtures/enrollment_fixt.yml que vai descrever os dados das matrículas.
1:
    student_id: 1
    year: 2010
2:
    student_id: 1
    year: 2011
3:
    student_id: 2
    year: 2011
Pronto, já temos nossas fixtures criadas agora é só instanciálas  nos arquivos de test
<?php
include_once dirname(__FILE__) . '/../support/enviromment.php';

/**
 * @group models 
 */
class StudentTest extends CIUnit_TestCase
{
    # load fixtures
    protected $tables = array(
        'enrollments' => 'enrollments',
        'people' => 'people'
    ); 
   //...

Agora ao rodar os testes eles devem passar
$  phpunit --testdox --color models/StudentTest.php
------------------
Student
 [x] Should be subclass of person
 [x] Should be an instance of student
 [x] Should have many enrollments




Referências:
http://giorgiosironi.blogspot.com/2009/12/practical-php-testing-is-here.html

Nenhum comentário:

Postar um comentário