PHPUnit и несколько Stub

Дмитрий
На сайте с 23.08.2006
Offline
222
1413

Вопрос для знающих PHPunit.

Тестируем 2 класса, при это нужно использовать 2 разных стаба. При запуске тестов по отдельности - все отлично. Когда запускаю все тесты на папку (даже с process-isolation):

Cannot redeclare class <имя Stub класса> in ...

Подскажите, как обходятся такие проблемы?

Пример: http://dl.dropbox.com/u/31119503/phpunit_isolation_test.zip

Разрабатываю и автоматизирую на php http://jonnyb.ru/
SD
На сайте с 08.12.2011
Offline
5
#1

День добрый.

Ну я бы предположил, что можно:

1. Называть стабы по разному (что в общем логично)

2. Использовать нэймспейсы

3. Использовать моки

Дмитрий
На сайте с 23.08.2006
Offline
222
#2

StarDust, приветствую.

1. Смысл стабов тогда несколько теряется.

2. Kак это поможет?

3. Моки используются для своих целей...

SD
На сайте с 08.12.2011
Offline
5
#3

Ладно, может я чего не понимаю, расскажите, что вы со стабами пытаетесь делать, для меня стаб - по сути то же, что и мок. Но я больше .net

Да, действительно разница есть, но все-таки поясните, что вы с ними собираетесь делать...

Дмитрий
На сайте с 23.08.2006
Offline
222
#4

Понял :) Суть какая...

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

Обусловимся:

1. для первого класса метод экземпляра 4го должен возвращать еденичку.

2. для второго - двойку.

3. для третьего - пусть отдает то что положено.

Структура теста получается следующая:

Оригинальный Class4.php:

class Class4 {
function myMethod() {
return 5;
}
}

1. FirstTest.php:
include './FirstTestStub.php';
class FirstTest {
function testMethod() {
$this->assertEquals(1, Class1::testMethod());
}
}

FirstTestStub.php:
class Class4 {
function myMethod() {
return 1;
}
}

2. SecondTest.php:
include './SecondTestStub.php';
class SecondTest {
function testMethod() {
$this->assertEquals(2, Class2::testMethod());
}
}

SecondTestStub.php:
class Class4 {
function myMethod() {
return 2;
}
}

3. ThirdTest.php:

class ThirdTest {
function testMethod() {
$this->assertEquals(5, Class3::testMethod());
}
}

Пример актуален если TestClass1::testMethod(), TestClass2::testMethod() и TestClass3::testMethod() просто возвращают результат работы метода 4го класса.

Несмотря на то что передается параметр --process-isolation php ругается: cannot redeclare class "Class4"

SD
На сайте с 08.12.2011
Offline
5
#5

Я пока смотрю, отпишусь, но, как я понял, стабы ничего не возвращают, а вот моки - возвращают.

Пруф: http://martinfowler.com/articles/mocksArentStubs.html

Что бы все не читать(хотя статья хорошая):

Stubs provide canned answers to calls made during the test, usually not responding at all to anything outside what's programmed in for the test. Stubs may also record information about calls, such as an email gateway stub that remembers the messages it 'sent', or maybe only how many messages it 'sent'.

Mocks are what we are talking about here: objects pre-programmed with expectations which form a specification of the calls they are expected to receive.

Фаулеру ну точно можно доверять :)

n0name
На сайте с 22.12.2006
Offline
54
#6
StarDust:
Я пока смотрю, отпишусь, но, как я понял, стабы ничего не возвращают, а вот моки - возвращают.

Наоборот. Стабы возвращают заранее определенные значения. Моки проверяют были ли выполнены нужные действия с ними (вызваны определённые методы с определёнными параметрами).

Сервис сравнения цена на VPS (http://vpska.com/)
Дмитрий
На сайте с 23.08.2006
Offline
222
#7

И то и другое хорошо к месту.. Проблема именно в phpunit и его изоляции, просто не могу нагуглить схожих проблем и есть подозрение что я что-то делаю не так :)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий