Feeds:
Posts
Comentários

Posts Tagged ‘IoC’

Bem, demorei mais do que havia planejado para escrever esse post. Nesse post eu vou falar sobre TDD com Test Doubles.

Para começar a apresentar os conceitos de Test Doubles, pedi para eles desenvolverem uma aplicação simples que deveria se conectar a um web-service que eu estava disponibilizando. Todos desenvolveram a aplicação utilizando TDD, so far so good. Então eu alterei o código do meu web-service, em um momento dei um sleep de 180 segundos e depois fiz ele lançar uma exceção.

Utilizei essas duas situações para mostrar um exemplo onde a utilização de Test Doubles: quando o sistema/classe depende de um recurso externo e/ou lento (acesso a rede ou disco por exemplo). Em seguida, eles fizeram outros testes, agora utilizando um mock e outro utlizando um stub que nós criamos.

Continuando comentei com eles outros benefícios de se utilizar Test Doubles, como o fato de você poder testar uma classe, sem que todas as classes do qual ela depende já estejam implementadas. Por exemplo, utilizando a idéia do web-service, se você está implementando uma classe que irá utilizar um cliente do web-service para pegar uma lista de tags para apresentar quais são as tags mais utilizadas. Abaixo um pedaço de código, demonstrando como a classe utiliza o cliente do web-service.

class TagsGenerator {
	private $client;
	public function __construct(WebServiceClient $client){
		$this->client = $client;
	}
	private function buildTagList(){
		$list = $this->client->getTagList();
                // código omitido
	}
        // demais métodos omitidos
}

Claro que você está sempre programando para a interface, então WebServiceClient é uma interface e não uma classe. Veja então que eu vou poder testar essa minha classe, antes mesmo que haja alguma implementação para a interface WebServiceClient. Aproveitei também esse exemplo para comentar mais sobre inversão de controle(IoC). Abaixo um exemplo de um método de teste.

	public function testShouldReturnMusicAsTopOneTag(){
        $stub = $this->getMock('WebServiceClient');
        $stub->expects($this->any())
             ->method('getTagList')
             ->will($this->returnValue(array('Music','Games','Videos')));
        // aqui, usando IoC e um stub eu posso testar
        // minha classe que constrói a lista de tags
        $generator = new TagsGenerator($stub);
        // resto do teste abaixo
	}

Outro benefício que pode ser alcançado com uma boa OO e test doubles é o isolamento entre testes. Além disso, comentei sobre o Mocks Aren’t Stubs do Fowler, que fala sobre as diferentes formas de se utilizar TDD, classicist ou mockist e citei que na minha opinião a melhor abordagem é saber utilizar bem as duas formas de TDD.

Final se semana escreverei outro post, comentando como foi feito o TDD com banco de dados.

Read Full Post »