2008-09-12 1 views
3

Я начинаю изучать, как использовать PHPUnit для тестирования веб-сайта, над которым я работаю. Проблема, с которой я сталкиваюсь, заключается в том, что у меня определено пять разных типов пользователей, и мне нужно иметь возможность тестировать каждый класс с разными типами. В настоящее время у меня есть класс пользователя, и я хотел бы передать это каждой функции, но я не могу понять, как передать это или проверить различные ошибки, которые могут вернутся как правильные или нет.Лучший способ тестирования сайта с несколькими типами пользователей с помощью PHPUnit

Редактировать: Я должен был сказать. У меня есть класс пользователя, и я хочу передать другой экземпляр этого класса для каждого модульного теста.

ответ

2

Если ваши различные классы пользователей наследуются от родительского пользовательского класса , то я рекомендую вам использовать ту же структуру наследования для ваших классов тестов.

Рассмотрим следующие примеры классов:

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

Вы можете сделать следующее с вашими классы тестов:

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

Поскольку каждый тест зависит от способа создания, который можно переопределить, и потому методы тестирования наследуются от родительского тестового класса, все тесты для родительского класса будут выполняться против дочернего класса, если вы не переопределите их для изменения ожидаемого поведения.

Это отлично поработало в моем ограниченном опыте.

1

Если вы хотите проверить фактический пользовательский интерфейс, вы можете попробовать использовать что-то вроде Selenium (www.openqa.org). Это позволяет вам писать код на PHP (который, как я предполагаю, будет работать с phpUnit), чтобы управлять браузером.

Другим подходом было бы иметь общий метод, который может быть вызван каждым тестом для вашего другого типа пользователя , то есть что-то вроде «ValidatePage», которое вы могли бы затем вызвать из TestAdminUser или TestRegularUser, и попросите метод просто выполнить ту же основную проверку того, что вы ожидаете.

1

Просто убедитесь, что вы не используете анти-шаблон здесь. Может быть, вы слишком много работаете в конструкторе? Или, может быть, это должны быть разные классы? Тесты часто дают вам подсказки о дизайне кода . Слушайте их.

Смежные вопросы