Back-End

13 jan, 2012

Rodando testes no CakePHP 2.0 – Parte 02

Publicidade

Dando continuidade aos nossos artigos sobre como rodar testes no CakePHP 2.0, hoje vamos ver como testar as models. Para isso utilizaremos o mesmo ambiente montado no artigo anterior, onde vimos como testar os controllers.

Quando comecei a estudar testes no CakePHP eu me perguntava como testar as models, comparando os registros retornados sem a necessidade de inserir os registros no banco de dados à mão. Assim descobri as fixtures e vamos começar por aí.

As fixtures são responsáveis por gerar tabela e dados temporários para a realização de testes de forma controlada e automática. Quando utilizamos fixtures para testar nossa aplicação, o CakePHP passará por cinco etapas para concluir os testes:

  • Criar as tabelas para cada fixture que ele precisar.
  • Preencher as tabelas com dados, se os dados forem fornecidos na fixture.
  • Rodar os testes.
  • Limpar as tabelas geradas pelas fixtures.
  • Remover as tabelas geradas pelas fixtures do banco de dados.

Como podemos ver, a utilização de fixtures facilitará nossos testes e por isso vamos começar criando uma fixture para testar o model post. Vá até a pasta /app/Test/Fixture/ e crie um arquivo chamado PostFixture.php. Agora vamos criar nossa classe PostFixture que extenderá de CakeTestFixture:

class PostFixture extends CakeTestFixture{

}

Vamos adicionar uma variável publica chamada $fields. Essa variável receberá um array com a estrutura de nossa tabela post:

public $fields = array(
'id' => array('type' => 'integer','key' => 'primary'),
'titulo' => array('type' => 'string','length' => 50,'null' => false),
'texto' => 'text',
'created' => 'datetime',
'modified' => 'datetime',
'publicado' => 'boolean'
);

Agora que nossa fixture já conhece a estrutura da tabela post, vamos adicionar uma variável pública chamada $records, onde adicionaremos um array com os dados para a fixture preencher a tabela temporária que foi criada:

public $records = array(
array('id' => 1,'titulo' => 'Teste 1','texto' => 'teste 1','created' => '2012-01-05 02:17:35','modified' => '2012-01-05 02:20:13','publicado' => true),
array('id' => 2,'titulo' => 'Teste 2','texto' => 'teste 2','created' => '2012-01-05 02:18:32','modified' => '2012-01-05 02:21:40','publicado' => false),
array('id' => 3,'titulo' => 'Teste 3','texto' => 'teste 3','created' => '2012-01-05 02:19:43','modified' => '2012-01-05 02:23:05','publicado' => true),
);

Com nossa fixture já criada, podemos então dar inicio a criação dos nossos testes para o model post.

Primeiramente, vá até a pasta /app/Test/Case/Model/  e crie um arquivo chamado PostTest.php.  Antes de iniciar a classe vamos adicionar a seguinte linha:

App::uses('Post','Model'); 

 Vamos iniciar a classe de teste PostTeste extendendo de CakeTestCase:

class PostTestCase extends CakeTestCase{
}

Agora, a primeira a se fazer é adicionar a fixture que nós criamos à nossa classe:

public $fixtures = array('app.post');

 Em seguida vamos criar um método chamado setUp onde vamos instanciar a classe da model post:

public function setUp(){
parent::setUp();
$this->Post = ClassRegistry::init('Post');
}

Já temos tudo pronto para começar a escrever nossos testes. Vamos então escrever um teste para verificar se o resultado do método find será igual ao que nós preparamos na classe PostFixture:

public function testFind(){
$result = $this->Post->find('all');
$expected = array(
array('Post' => array('id' => 1,'titulo' => 'Teste 1','texto' => 'teste 1','created' => '2012-01-05 02:17:35','modified' => '2012-01-05 02:20:13','publicado' => true)),
array('Post' => array('id' => 2,'titulo' => 'Teste 2','texto' => 'teste 2','created' => '2012-01-05 02:18:32','modified' => '2012-01-05 02:21:40','publicado' => false)),
array('Post' => array('id' => 3,'titulo' => 'Teste 3','texto' => 'teste 3','created' => '2012-01-05 02:19:43','modified' => '2012-01-05 02:23:05','publicado' => true)),
);
$this->assertEqual($result, $expected);
}

O método assertEqual faz uma comparação entre o primeiro parâmetro passado e o segundo, checando se os dois são iguais.

Vamos escrever um método no model post chamado de publicado, onde buscamos somente as publicações que estão com o campo publicado como true:

 public function publicado(){
$conditions = array('conditions' => array('publicado' => true));
$results = $this->find('all',$conditions);
return $results;
}

Depois vamos à nossa classe PostTest para adicionar o seguinte teste:

public function testPublicado(){
$result = $this->Post->publicado();
$expected = array(
array('Post' => array('id' => 1,'titulo' => 'Teste 1','texto' => 'teste 1','created' => '2012-01-05 02:17:35','modified' => '2012-01-05 02:20:13','publicado' => true)),
array('Post' => array('id' => 3,'titulo' => 'Teste 3','texto' => 'teste 3','created' => '2012-01-05 02:19:43','modified' => '2012-01-05 02:23:05','publicado' => true)),
);
$this->assertEqual($result, $expected);
}

Após rodar os testes no model, faça novamente o teste do controller para conferir se tudo está correto. Provavelmente ele irá retornar um erro parecido com este:

Isso acontece porque, como foi citado no início do artio, quando criamos um fixture no cake ele passa por cinco etapas, onde a quinta etapa é remover a tabela criada temporariamente.

Para que os testes do controller voltem a funcionar normalmente, adicione a seguinte linha logo abaixo da variável $name:

public $fixtures = array('app.post');

Isso fará com que o controller utilize nossa fixture, que por sua vez irá gerar uma tabela temporária para realizar os testes.

Estes testes nos models e controllers são bastante simples de serem realizados como vimos até agora. Com a utilização das fixtures podemos ter total controle sobre os dados utilizados nos testes.

Espero que estejam gostando dos artigos e até a próxima!