[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PhpUnit Test
ser5027
Доброго времени суток!
Подскажите где можно найти хорошую инфу для написание юнит тестов для объектов и методов в которых присутствует наследование или вызовы статических методов других объектов. Все что я встречал это для начинающих в которых показаны вещи до которых не сложно догадаться... а вот что-то более интересное так и не нашел... может кто встречал? Заранее спасибо...
vasa_c
С каким сложностями столкнулись?

_____________
Блог ГО | Таблица символов Юникода | Графомания
ser5027
Ну например есть тестируемый метод со строкой
$validationResult = PasswordValidator::validatePassword($password);

и мне нужно сделать так чтоб вместо
PasswordValidator::validatePassword($password)

подставлялись данные из dataProvider
glock18
ser5027
У вас, видимо, путаница с концепцией unit-тестирования. Один unit-test должен покрывать только один use-case одного метода. Соответственно, если у вас есть метод PasswordValidator::validatePassword, который вы хотите проверять, то данные ему нужно передавать предопределенные (которые он должен пропустить или не пропустить - обычно по тесту на каждый сценарий, можно по тесту на каждый подвид пароля). Если же вы тестируете какой-то метод dataProvider'а, то кроме него ничего не должно выполняться.

PS: в этом случае неважно, если метод использует другие объекты или наследует откуда-то логику полностью или частично, вы проверяете конкретно этот метод. Соответственно, каждый используемый им метод, проверяется отдельным test case'ом.
ser5027
кое что понял но не все!
- что подразумевается под "use-case одного метода"?
- что является test case'ом, это отдельный тестирующий класс?
и мне нужно чтоб $validationResult = PasswordValidator::validatePassword($password); на строку типа
$validationResult = $someVar; - где $someVar будет переменной из dataProvider.
Все это мне нужно так как по инструкции этой строки он лезет в ядро и начинает ругаться на невозможность подключить кучу файлов да и собственно мне их тестить и не нужно!
glock18
Цитата (ser5027 @ 24.02.2014 - 18:00)
кое что понял но не все!
- что подразумевается под "use-case одного метода"?
- что является test case'ом, это отдельный тестирующий класс?
и мне нужно чтоб $validationResult = PasswordValidator::validatePassword($password); на строку типа
$validationResult = $someVar; - где $someVar будет переменной из dataProvider.
Все это мне нужно так как по инструкции этой строки он лезет в ядро и начинает ругаться на невозможность подключить кучу файлов да и собственно мне их тестить и не нужно!

unit test - класс теста, отвечающий за тестирование методов одного класса
test case - это один метод теста, покрывающий один из вариантов его работы.

Например, если есть метод


class myClass {
public function myAwesomeMethod($i) {
return $i > 0 ? 1 : ($i == 0 ? 0 : -1);
}
}


возвращает
* 1, если параметр больше 0
* 0, если равен 0
* -1, если меньше 0

Это три кейса, которые надо покрыть.
Соответственно ваши кейсы будут в духе
public function myAwesomeMethodTest1() {
$myClassInstance = new myClass();
$result = $myClassInstance->myAwesomeMethod(15);

$this->assert($result, 1);
}

public function myAwesomeMethodTest2() {
$myClassInstance = new myClass();
$result = $myClassInstance->myAwesomeMethod(-10);

$this->assert($result, -1);
}

public function myAwesomeMethodTest3() {
$myClassInstance = new myClass();
$result = $myClassInstance->myAwesomeMethod(0);

$this->assert($result, 0);
}


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

Теперь если ситуация у вашего validatePassword. test case'ы могут отличаться в зависимости от того, как ваша функция работает, но в целом это может быть типа(по вашей записи предположу, что метод у вас статический):

public function validatePasswordTest1() {
$result = PasswordValidator::validatePassword('qwe123rty'); // valid password

$this->assert($result, true);
}

public function myAwesomeMethodTest2() {
$result = PasswordValidator::validatePassword('q1'); // too short

$this->assert($result, false); // validation shouldn't pass thus asserting to false
}

public function myAwesomeMethodTest3() {
$result = PasswordValidator::validatePassword('qwe'); // only letters, digits are also required

$this->assert($result, false);
}


Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.