Pergunta

Com o risco de ser inflamado ... que vantagem não impor chamadas para métodos em vez de funções têm em um contexto onde o contexto é implícito.

Considerando que a sintaxe do PHP é tão feio para chamar métodos por que os criadores do PHPUnit ter imposto a sua utilização?

Se o quadro havia estabelecido um objeto global "currentTestCase" e, em seguida, de forma transparente falhou associado afirma com esse objeto que poderia estar escrevendo:

assertEquals("blah", $text);

em oposição ao equivalente, mas detalhado:

$this->assertEquals("blah", $text);

O que exatamente é que vamos chegar usando OO neste contexto.

Por favor me esclareça.

Foi útil?

Solução

Porque PHPUnit é derivado de xUnit e é assim que xUnit faz.

Por que xUnit fazê-lo dessa forma? Estou feliz que você pediu. A razão original, como Robert aponta, é que xUnit vem de Smalltalk e foi popularizado por JUnit em Java. Ambos são linguagens OO ou nada para que eles não tinha escolha.

Isto não quer dizer que não existem outras vantagens. OO testes podem ser herdadas. Isto significa que se você quiser testar uma subclasse você pode executar todos os testes do pai e apenas substituir o punhado de métodos de ensaio para os comportamentos você mudou. Isto dá-lhe uma excelente cobertura de subclasses sem ter que código de teste duplicado.

Seu fácil de adicionar e substituir assert métodos em PHPUnit. Apenas subclasse PHPUnit_Framework_TestCase, escrever seus próprios métodos assert e ter suas classes de teste herdar de sua nova subclasse. Você também pode setup e teardown métodos padrão de escrita.

Finalmente, ela garante que os métodos do framework de teste não vai colidir com a coisa que eles estão testando. Se a estrutura de teste apenas dumping suas funções para o teste e você queria testar algo que tinha um método setup ... bem, você está em apuros.

Dito isso, eu ouço sua dor. Um quadro grande teste pode ser chato e pesado e frágil. Perl não usar um estilo xUnit, ele usa um estilo de procedimento com nomes de funções de teste curto. Consulte Test :: Mais para um exemplo. Nos bastidores ele faz apenas o que você sugeriu, há um teste instância do objeto singleton que todas as funções de usar. Há também um híbrido funções do assert processuais com métodos de ensaio OO módulo chamado Test :: Classe que faz o melhor dos dois mundos.

Considerando que a sintaxe do PHP é tão feio para chamar métodos

Eu acho que você não gosta do ->. Eu sugiro que você aprender a viver com ela. OO PHP é muito melhor do que a alternativa.

Outras dicas

Uma razão boa é que assertXXX como um nome de método tem um alto risco para a nomeação de choque.

Outra é que ele é derivado do xUnit família, que normalmente lida com linguagens orientadas a objeto - Smalltalk inicialmente. Isto torna mais fácil para si mesmo relacionado a seus "irmãos" de exemplo Java e Ruby.

Não é uma resposta direta, mas a partir de PHPUnit 3.5, você não tem que escrever $this-> mais. PHPUnit 3.5 acrescentou uma biblioteca de funções para as afirmações, que você tem que incluir

require_once 'PHPUnit/Framework/Assert/Functions.php';

Em seguida, você pode fazer

assertEquals('foo', $bar);

Blog pós See de Sebastian Bergmann sobre isso

Tendo os casos de teste na classe-métodos poupa trabalho para PHPUnit. Devido à falta de built-in PHPUnit inteligência não poderia encontrar ou lidar com funções de teste puros. Apenas ter que reconhecer a -> assert * () mensagens -Em uma Chain boolean simples novamente salva o processamento de lógica (para PHPUnit, não é o caso de teste autor). É tudo sal sintática que salva em cima do ponto PHPUnit / SimpleTest de vista.

Não seria um problema técnico ao erro captura / mensagens de aviso, exceções ou reconhecer do PHP assert nativa () declaração. Não é feito porque a API difícil parece mais enterprisey.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top