PHPUnit, testando Exception
Autor: Pedro Ribeiro | Publicado: 2013-02-07T14:08:00-08:00












Olá pessoal,

hoje vou demonstrar como testar um lançamento de exceção com PHPUnit.

Isso na verdade é bem simples, mas vou expor um cenário em que eu estava quando utilizei.


Segue cenário:






class&nbsp;GmFactory


{


&nbsp; &nbsp;&nbsp;/**


&nbsp; &nbsp; &nbsp;* @param $modelo


&nbsp; &nbsp; &nbsp;* @return Carro


&nbsp; &nbsp; &nbsp;*/


&nbsp; &nbsp;&nbsp;public&nbsp;function&nbsp;create($modelo)


&nbsp; &nbsp;&nbsp;{


&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;($modelo&nbsp;==&nbsp;'corsa')&nbsp;{


&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;Corsa();


&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;($modelo&nbsp;==&nbsp;'astra')&nbsp;{


&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;Astra();


&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;}&nbsp;else&nbsp;{


&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;null;


&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;}


&nbsp; &nbsp;&nbsp;}


}





A classe 'GmFactory' é um Factory, ou uma fábrica. Essa classe constrói objetos do tipo Carro.

Da forma em que ela está neste momento, ela poderia retornar NULL e comprometer a execução caso alguém utilize esta fábrica passando um modelo que ela não sabe construir.

No meu caso, eu rafatorei para que seja lançada um exceção caso alguém utilize a fábrica de forma errada, pois quem tiver que usar tem que saber quais modelos a fábrica constrói antes de querer utilizá-la.


Com a refatoração ficou desta forma:






class&nbsp;GmFactory


{


&nbsp; &nbsp;&nbsp;/**


&nbsp; &nbsp; &nbsp;* @param $modelo


&nbsp; &nbsp; &nbsp;* @return Carro


&nbsp; &nbsp; &nbsp;* @throws InvalidArgumentException


&nbsp; &nbsp; &nbsp;*/


&nbsp; &nbsp;&nbsp;public&nbsp;function&nbsp;create($modelo)


&nbsp; &nbsp;&nbsp;{





&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;($modelo&nbsp;==&nbsp;'corsa')&nbsp;{


&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;Corsa();


&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;($modelo&nbsp;==&nbsp;'astra')&nbsp;{


&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;Astra();


&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;}&nbsp;else&nbsp;{


&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;throw&nbsp;new&nbsp;InvalidArgumentException('Modelo inválido');


&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;}


&nbsp; &nbsp;&nbsp;}


}






Desta forma, quem quiser utilizar a fábrica precisa saber o que está fazendo....




Agora vamos ao teste









class&nbsp;GmFactoryTest&nbsp;extends&nbsp;PHPUnit_Framework_TestCase


{





&nbsp; &nbsp;&nbsp;/**


&nbsp; &nbsp; &nbsp;* @expectedException InvalidArgumentException


&nbsp; &nbsp; &nbsp;*/


&nbsp; &nbsp;&nbsp;public&nbsp;function&nbsp;testCreateWithException()


&nbsp; &nbsp;&nbsp;{


&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;$gmFactory&nbsp;=&nbsp;new&nbsp;GmFactory();


&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;$gmFactory-&gt;create('vectra');


&nbsp; &nbsp;&nbsp;}





&nbsp; &nbsp;&nbsp;public&nbsp;function&nbsp;testCreateWithCorsa()


&nbsp; &nbsp;&nbsp;{


&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;$gmFactory&nbsp;=&nbsp;new&nbsp;GmFactory();


&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;$carro&nbsp;=&nbsp;$gmFactory-&gt;create('corsa');


&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;$this-&gt;assertInstanceOf('Corsa',&nbsp;$carro);


&nbsp; &nbsp;&nbsp;}





&nbsp; &nbsp;&nbsp;public&nbsp;function&nbsp;testCreateWithAstra()


&nbsp; &nbsp;&nbsp;{


&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;$gmFactory&nbsp;=&nbsp;new&nbsp;GmFactory();


&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;$carro&nbsp;=&nbsp;$gmFactory-&gt;create('astra');


&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;$this-&gt;assertInstanceOf('Astra',&nbsp;$carro);


&nbsp; &nbsp;&nbsp;}


}







No PHPUnit existe a anottation&nbsp;@expectedException&nbsp;que marca o teste, e defini que esta execução irá resultar em uma exceção. Para funcionar, apenas temos que marcar o teste que queremos testar e definirmos qual o tipo de exceção será lançada, com isso o PHPUnit já identifica e mostra o resultado do teste como sucesso.


Bom pessoal é isso aí, abraço!