Unit testing is about testing the observable behaviors of a class! Observable from the outside! Nobody cares about the internal state of a class if it never changes the outcome of a method call
If it takes to long to run your tests, you won't do it
Criar bootstrap específicos para testes que dependam de algumas poucas funcionalidades, sem levantar todo o framework.
Utilizar assertions específicas, além de uma melhor leitura, garantem uma resposta mais legível e melhor compreensão sobre o porquê o teste falhou.
$this->assertEquals(null, $some->return());
// 12 ocorrências$this->assertEquals([], $some->return());
// 25 ocorrências$this->assertEquals(false, $some->return());
// 8 ocorrências// Array
assertArrayHasKey()
assertContains()
assertContainsOnly()
assertContainsOnlyInstancesOf()
assertCount()
assertEmpty()
assertSame()
// JSON
assertJsonFileEqualsJsonFile()
assertJsonStringEqualsJsonFile()
assertJsonStringEqualsJsonString()// String
assertRegExp()
assertStringMatchesFormat()
assertStringMatchesFormatFile()
assertStringEndsWith()
assertStringEqualsFile()
assertStringStartsWith()// XML
assertEqualXMLStructure()
assertXmlFileEqualsXmlFile()
assertXmlStringEqualsXmlFile()
assertXmlStringEqualsXmlString()assertInstanceOf()
assertAttributeEquals()
assertFileExists()
assertThat()<?php
class MyCustomConstraint
extends \PHPUnit_Framework_Constraint
{
public function matches($other) { /* Code */ }
}<?php
use PHPUnit_Framework_TestCase as TestCase;
class MyTestCase extends TestCase
{
public function assertCustom($expectation) {
$this->assertThat($expectation, new MyCustomConstraint());
}
}public function getCsv()
{
return file_get_contents(
__DIR__ . '/data-fixtures/sale_orders.csv'
);
}Número do Pedido|Criado em|Status|Última atualização de status|Cliente|CPF|E-mail|Assistida pelo Televendas|Assessor do Televendas|Valor dos Itens|Valor do Frete|Desconto|Valor Final|Tipo de Entrega|Transportadora|Serviço|Cartão 1 - Bandeira|Cartão 1 - Parcelas|Cartão 1 - Valor|Cartão 2 - Bandeira|Cartão 2 - Parcelas|Cartão 2 - Valor
E123|10/10/2014 16:00:00|DESPACHADO|20/11/2014 17:00:00|John Doe|12345678901|john@doe.com|Não||50|20|10|40|Rápida|TEX COURIER|TOTAL EXPRESS|VISA|2|40|
E456|11/10/2014 13:00:00|ENTREGUE|21/11/2014 14:00:00|Another John|10987654321|another@john.com|Sim|Jane Doe|300|45.5|50.9|380.86|Agendada|CORREIOS|PAC|MASTERCARD|2|280.86|AMEX|1|100|public function testExportShouldGenerateASuccessCSVFile()
{
$this->assertStringEqualsFile(
__DIR__.'/fixtures/expected_sale_orders.csv',
$this->saleOrders->toString();
);
}Número do Pedido|Criado em|Status|Última atualização de status|Cliente|CPF|E-mail|Assistida pelo Televendas|Assessor do Televendas|Valor dos Itens|Valor do Frete|Desconto|Valor Final|Tipo de Entrega|Transportadora|Serviço|Cartão 1 - Bandeira|Cartão 1 - Parcelas|Cartão 1 - Valor|Cartão 2 - Bandeira|Cartão 2 - Parcelas|Cartão 2 - Valor
E123|10/10/2014 16:00:00|DESPACHADO|20/11/2014 17:00:00|John Doe|12345678901|john@doe.com|Não||50|20|10|40|Rápida|TEX COURIER|TOTAL EXPRESS|VISA|2|40|
E456|11/10/2014 13:00:00|ENTREGUE|21/11/2014 14:00:00|Another John|10987654321|another@john.com|Sim|Jane Doe|300|45.5|50.9|380.86|Agendada|CORREIOS|PAC|MASTERCARD|2|280.86|AMEX|1|100|Os testes devem ser isolados; devem permitir ser executados separada e independentemente. Mas se precisar...
public function testAddShouldAppendAnItemInArray()
{
$bag = new Bag();
$item = new Item('some name');
$bag->add($item);
$this->assertEquals([$item], $bag->all());
return [$bag, $item];
}
/**
* @depends testAddShouldAppendAnItemInArray
*/
public function testRemoveShouldDeleteGivenItemFromBag(
$bag,
Item $item
) {
$bag->remove($item);
$this->assertEmpty($bag->all());
}