[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема с PHPUnit
Invis1ble
Всем привет. Возникла проблема, в гугле не нашел подобного.
Цитата
1) Warning
The data provider specified for FooTest::testBar is invalid.
Undefined offset:  0

код
class FooTest extends PHPUnit_Framework_TestCase {

public static $objects = array();

public static function setUpBeforeClass()
{
parent::setUpBeforeClass();
self::$objects = array(
new Exception('foo'),
new Exception('bar')
);

}

/**
*
@dataProvider provider
*/

public function testBar($o)
{
$this->assertTrue(true);
}

public function provider()
{
return array(
array(self::$objects[0])
);

}

public static function tearDownAfterClass()
{
self::$objects = array();
parent::tearDownAfterClass();
}

}

Причем, если поменять таким образом:
код
class FooTest extends PHPUnit_Framework_TestCase {

public static $object = null;

public static function setUpBeforeClass()
{
parent::setUpBeforeClass();
self::$object = new Exception('foo');
}

/**
*
@dataProvider provider
*/

public function testBar($o)
{
$this->assertTrue(true);
}

public function provider()
{
return array(
array(self::$object)
);

}

public static function tearDownAfterClass()
{
self::$object = null;
parent::tearDownAfterClass();
}

}

то все норм, никаких ошибок.
Кто подскажет, в чем дело? Где я ошибся?

PS. Версия PHPUnit - 3.6.10



Спустя 19 минут, 35 секунд (25.02.2012 - 19:19) Invis1ble написал(а):
Объекты тут оказывается не при чем, если попробовать так
class FooTest extends PHPUnit_Framework_TestCase {

public static $data = array();

public static function setUpBeforeClass()
{
parent::setUpBeforeClass();
self::$data = array('val');
}

/**
*
@dataProvider provider
*/

public function testBar($o)
{
$this->assertTrue(true);
}

public function provider()
{
return array(
array(self::$data[0])
);

}

public static function tearDownAfterClass()
{
self::$data = array();
parent::tearDownAfterClass();
}

}

результат тот же - invalid provider

Спустя 1 час, 11 минут, 56 секунд (25.02.2012 - 20:31) Dezigo написал(а):
А что ты хочешь создать? Как ты вызываешь?
Сделай для начало print_r(self::$data[0]);

Спустя 18 минут, 23 секунды (25.02.2012 - 20:50) Invis1ble написал(а):
Dezigo
Цитата
Сделай для начало print_r(self::$data[0]);

пробовал - пустой массив показывает...
Цитата
А что ты хочешь создать? Как ты вызываешь?

пример выше сильно утрирован, в self::$data находится массив объектов, который создается в setUpBeforeClass()
Насколько я понял, проблема в том, что провайдер вызывается до setUpBeforeClass, т.е. проблема в коде PHPUnit

Спустя 3 часа, 58 минут, 2 секунды (26.02.2012 - 00:48) Oyeme написал(а):
Логично что Вы пытаетесь подать массив с ключом 0,которого не существует.
Если вызываеться "до",то Вы сделайте проверку.

if(empty(self::$data)){
self::setUpBeforeClass();
}

Спустя 11 минут, 19 секунд (26.02.2012 - 00:59) Invis1ble написал(а):
Oyeme
Не, к сожалению такой вариант не подходит.
В setUpBeforeClass идет работа с БД и настраивается окружение, т.е. если я вставлю такую проверку, то setUpBeforeClass вызовется дважды и окружение будет некорректным.
Можно конечно написать костыль в виде установки некоего токена, который сигнализирует о том, что setUpBeforeClass уже вызывался и таким образом избежать повторного выполнения кода, но что-то мне не нравится такой вариант... dry.gif

Спустя 10 минут, 10 секунд (26.02.2012 - 01:09) Invis1ble написал(а):
Судя по мануалу,
http://www.phpunit.de/manual/3.6/en/fixtures.html
Данный метод вызывается самым первым, что вполне логично.
Однако, простая проверка
    public static function setUpBeforeClass()
{
echo __METHOD__ . "\n";
parent::setUpBeforeClass();
self::$data = array('val');
}

/**
*
@dataProvider provider
*/

public function testBar($o)
{
$this->assertTrue(true);
}

public function provider()
{
echo __METHOD__ . "\n";
return array(
array(self::$data[0])
);

}

показывает, что провайдер действительно вызывается до setUpBeforeClass, как я и предполагал.

Спустя 57 минут, 17 секунд (26.02.2012 - 02:06) Oyeme написал(а):
Чтобы не гадать,используйте обычный "дебагер"(в eclipe очень удобный дебагер).

Так Вы пошагам увидите почему массив пустой,и что его таким делает. ;)

Возжно после строчки

 parent::setUpBeforeClass();


массиву вообще не присваеваетя значение,до него просто не доходит.

Спустя 9 часов, 7 минут, 53 секунды (26.02.2012 - 11:14) Invis1ble написал(а):
Цитата
Чтобы не гадать,используйте обычный "дебагер"(в eclipe очень удобный дебагер).

Так Вы пошагам увидите почему массив пустой,и что его таким делает. ;)

у меня NetBeans, там дебагер постоянно отваливается к сожалению.
да он и не нужен, я в примере выше показал, как я проверил.

Цитата
Возжно после строчки

parent::setUpBeforeClass();


массиву вообще не присваеваетя значение,до него просто не доходит.

доходит, просто не в том порядке, в каком я ожидал...
код
class FooTest extends PHPUnit_Framework_TestCase {

public static $data = array();

public static function setUpBeforeClass()
{
echo __METHOD__ . "\n";
parent::setUpBeforeClass();
self::$data = array('val');
}

/**
*
@dataProvider provider
*/

public function testBar($o)
{
$this->assertTrue(true);
}

public function provider()
{
echo __METHOD__ . "\n";
return array(
array(self::$data[0])
);

}

public static function tearDownAfterClass()
{
self::$data = array();
parent::tearDownAfterClass();
}

}

вывод
Цитата
FooTest::provider
PHPUnit 3.6.10 by Sebastian Bergmann.

FooTest::setUpBeforeClass
F..............................................................  63 / 112 ( 56%)
.............SSSSSSSS...........................

Time: 6 seconds, Memory: 10.25Mb

There was 1 failure:

1) Warning
The data provider specified for FooTest::testBar is invalid.
Undefined offset:  0

C:\php\phpunit:46

FAILURES!
Tests: 104, Assertions: 829, Failures: 1, Skipped: 8.




Спустя 7 минут, 59 секунд Invis1ble написал(а):
Пока что я решил проблему передавая из провайдера не объекты, а ключи массива объектов.


_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

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

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