Domanda

Sto iniziando a imparare come utilizzare PHPUnit per testare il sito web su cui sto lavorando.Il problema che sto riscontrando è che ho definito cinque diversi tipi di utente e devo essere in grado di testare ogni classe con i diversi tipi.Al momento ho una classe utente e vorrei passarla a ciascuna funzione, ma non riesco a capire come passarla o testare i diversi errori che potrebbero risultare corretti o meno.

Modificare: Avrei dovuto dirlo.Ho una classe utente e voglio passare un'istanza diversa di questa classe a ciascun test unitario.

È stato utile?

Soluzione

Se le tue varie classi utente ereditano da una classe utente genitore, ti consiglio di utilizzare la stessa struttura di ereditarietà per le classi del test case.

Considera le seguenti classi di esempio:

class User
{
    public function commonFunctionality()
    {
        return 'Something';
    }

    public function modifiedFunctionality()
    {
        return 'One Thing';
    }
}

class SpecialUser extends User
{
    public function specialFunctionality()
    {
        return 'Nothing';
    }

    public function modifiedFunctionality()
    {
        return 'Another Thing';
    }
}

Potresti fare quanto segue con le classi del caso di test:

class Test_User extends PHPUnit_Framework_TestCase
{
    public function create()
    {
        return new User();
    }

    public function testCommonFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('Something', $user->commonFunctionality);
    }

    public function testModifiedFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('One Thing', $user->commonFunctionality);
    }
}

class Test_SpecialUser extends Test_User
{
    public function create() {
        return new SpecialUser();
    }

    public function testSpecialFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('Nothing', $user->commonFunctionality);
    }

    public function testModifiedFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('Another Thing', $user->commonFunctionality);
    }
}

Poiché ogni test dipende da un metodo create che è possibile sovrascrivere e poiché i metodi di test sono ereditati dalla classe di test genitore, tutti i test per la classe genitore verranno eseguiti sulla classe figlio, a meno che non li sovrascrivi per modificare il comportamento previsto.

Questo ha funzionato benissimo nella mia esperienza limitata.

Altri suggerimenti

Se stai cercando di testare l'interfaccia utente effettiva, potresti provare a utilizzare qualcosa come Selenium (www.openqa.org).Ti consente di scrivere il codice in PHP (che presumo funzionerebbe con phpUnit) per guidare il browser..

Un altro approccio sarebbe quello di avere un metodo comune che possa essere chiamato da ciascun test per il diverso tipo di utente.cioè qualcosa come "ValidatePage", che potresti quindi chiamare da TestAdminUser o TestRegularUser e fare in modo che il metodo esegua semplicemente la stessa convalida di base di ciò che ti aspetti.

Assicurati solo di non imbatterti in un anti-modello Qui.Forse lavori troppo nel costruttore?O forse queste dovrebbero essere in realtà classi diverse?I test spesso ti danno indizi su progettazione del codice. Ascoltali.

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