2008-09-12 24 views
3

Je commence à apprendre à utiliser PHPUnit pour tester le site sur lequel je travaille. Le problème que je rencontre est que j'ai cinq types d'utilisateurs différents définis et je dois être capable de tester chaque classe avec les différents types. J'ai actuellement une classe d'utilisateur et je voudrais passer ceci à chaque fonction mais je ne peux pas comprendre comment passer ceci ou tester les différentes erreurs qui pourraient revenir comme étant correctes ou non.Best Way to Unit Test d'un site Web avec plusieurs types d'utilisateurs avec PHPUnit

Editer: J'aurais dû dire. J'ai une classe d'utilisateurs et je veux passer une instance différente de cette classe à chaque test unitaire.

Répondre

2

Si vos différentes classes d'utilisateurs héritent d'une classe d'utilisateurs parente , alors je vous recommande d'utiliser la même structure d'héritage pour vos classes de cas de test.

Tenir compte des classes d'exemples suivants:

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'; 
    } 
} 

Vous pouvez faire ce qui suit avec vos cas tests des classes:

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); 
    } 
} 

Parce que chaque test dépend d'une méthode de création que vous pouvez remplacer, et parce que les méthodes de test sont héritées de la classe de test parent, tous les tests de la classe parent seront exécutés sur la classe enfant, sauf si vous les remplacez pour modifier le comportement attendu.

Cela a très bien fonctionné dans mon expérience limitée.

1

Si vous cherchez à tester l'interface utilisateur réelle, vous pouvez essayer d'utiliser quelque chose comme Selenium (www.openqa.org). Il vous permet d'écrire le code en PHP (que je suppose fonctionnerait avec phpUnit) pour piloter le navigateur.

Une autre approche serait d'avoir une méthode commune qui pourrait être appelée par chaque test pour votre type d'utilisateur différent . c'est-à-dire, quelque chose comme 'ValidatePage', que vous pouvez ensuite appeler depuis TestAdminUser ou TestRegularUser et avoir la méthode simplement effectuer la même validation de base de ce que vous attendez ..

1

Assurez-vous simplement que vous ne rencontrez pas un anti-modèle ici. Peut-être que vous faites trop de travail dans le constructeur? Ou peut-être que ce devrait être en fait des classes différentes? Les tests vous donnent souvent des indices sur la conception du code . Écoutez-les.