Domanda

A rischio di essere fiammato ... quale vantaggio non far rispettare le chiamate a metodi piuttosto che funzioni hanno in un contesto dove il contesto è implicita.

Visto che la sintassi di PHP è così brutto per chiamare i metodi perché avrebbero creatori di PHPUnit hanno imposto il suo utilizzo?

Se il quadro aveva fissato un oggetto globale "currentTestCase" e quindi in modo trasparente associato fallito afferma con quell'oggetto potremmo scrivendo:

assertEquals("blah", $text);

in contrasto con l'equivalente, ma verbose:

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

Che cosa fare si ottiene utilizzando OO in questo contesto.

Si prega di illuminarmi.

È stato utile?

Soluzione

A causa PHPUnit è derivato da xUnit ed è così che xUnit lo fa.

Perché xUnit farlo in quel modo? Sono contento che hai chiesto. Il motivo originale, come Robert sottolinea, è che xUnit viene da Smalltalk e fu reso popolare da JUnit in Java. Entrambi sono linguaggi OO-o-niente di così non avevano scelta.

Non

Questo per dire che non ci sono altri vantaggi. test OO possono essere ereditate. Ciò significa che se si vuole testare una sottoclasse è possibile eseguire i test tutto del genitore e solo ignorare la manciata di metodi di prova per i comportamenti che sono cambiato. Questo ti dà una copertura eccellente di sottoclassi senza dover duplicare il codice di prova.

La sua facile da aggiungere e sostituire i metodi assert in PHPUnit. Proprio PHPUnit_Framework_TestCase sottoclasse, scrivere i propri metodi assert e avere il vostro classi di test ereditano dalla vostra nuova sottoclasse. Si può anche scrivere setup e teardown metodi predefiniti.

Infine, garantisce che i metodi del quadro di prova non stanno andando a scontrarsi con la cosa che stanno testando. Se il quadro di prova appena scaricato le sue funzioni in test e si voleva mettere alla prova qualcosa che avesse un metodo setup ... ben sei nei guai.

Detto questo, sento il vostro dolore. Un quadro grande prova può essere fastidioso e ingombrante e fragile. Perl non usa uno stile xUnit, utilizza uno stile procedurale con i nomi delle funzioni breve test. Vedere Test :: More per un esempio. Dietro le quinte si fa proprio quello che lei ha suggerito, c'è un oggetto istanza di prova Singleton che tutte le funzioni utilizzano. C'è anche un ibrido funzioni assert procedurali con modulo metodi di prova OO chiamato Test :: Classe che fa il meglio dei due mondi.

  

Visto che la sintassi di PHP è così brutto per chiamare i metodi

Credo che non ti piace il ->. Io suggerisco di imparare a convivere con essa. OO PHP è molto più piacevole che l'alternativa.

Altri suggerimenti

Una buona ragione è che assertXXX come un nome di metodo ha un alto rischio per la denominazione scontro.

Un altro è che è derivato dalla xUnit di famiglia, che si occupa in genere con linguaggi orientati agli oggetti - Smalltalk inizialmente. Questo rende più facile per te legata ai vostri "fratelli" da esempio Java e Ruby.

Non è una risposta diretta, ma a partire da PHPUnit 3.5, non c'è bisogno di scrivere più $this->. PHPUnit 3.5 aggiunge una libreria di funzioni per le asserzioni, che è necessario includere

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

Poi si può fare

assertEquals('foo', $bar);

Vedere di Sebastian Bergmann Blog post su di esso

Avere i casi di test in classe-metodi salva lavoro per PHPUnit. A causa della mancanza di PHPUnit intelligenza incorporata non riusciva a trovare o gestire funzioni di test puri. Solo dover riconoscere il -> assert * () i messaggi -in un semplice booleano a catena salva ancora una volta la logica di elaborazione (per PHPUnit, non il test caso dell'autore). E 'tutto il sale sintattica che salva in testa dal punto di vista PHPUnit / SimpleTest.

Non sarebbe un problema tecnico per catturare errore / messaggi di avviso, eccezioni o riconoscere phps assert nativo () dichiarazione. Non è fatto perché un'API difficile sembra più enterprisey.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top