Я читаю этот руководство, но я не понимаю, почему $ stack теряет значения после каждой тестовой функции.
Вот мой код:
require_once BASE . 'Transaction.php';
class TransactionTest extends PHPUnit_Framework_TestCase
{
protected $stack;
protected function setUp()
{
Database::getInstance()->connect();
$this->stack = new Transaction(123456789);
}
public function testInsert()
{
$data['name'] = 'Omega';
$this->stack->set($data);
$this->assertTrue($this->stack->save());
}
public function testUpdate()
{
$object = PHPUnitReflectionClass::getInstance($this->stack);
$this->assertEquals(array('name' , 'Omega'), $object->getProperty('name'));
}
}
В функции «testUpdate» у меня нет имени.
Если я просто скопирую весь пример PHPUnit, все тесты будут работать отлично, но я не смог увидеть значения с помощью var_dump в следующей функции. И это еще одна вещь, которую я не понимаю.
Проблемы:
Для первая проблема Вы можете использовать setUpBeforeClass
метод. От доктор:
Методы шаблона setUp () и tearDown () запускаются один раз для каждого теста
метод (и на свежих экземплярах) класса тестового случая.Кроме того, шаблоны setUpBeforeClass () и tearDownAfterClass ()
методы вызываются до того, как будет выполнен первый тест класса теста
и после последнего теста класса теста запускается, соответственно.
Для вторая проблема, плохая практика иметь тесты, которые зависят друг от друга, но PHPUnit поддерживает объявление явных зависимостей между методами тестирования, поэтому вы можете использовать @depends
аннотация для выражения зависимостей: если тест не пройден, другой не выполняется.
Таким образом, ваш тестовый класс может быть, например:
require_once BASE . 'Transaction.php';
class TransactionTest extends PHPUnit_Framework_TestCase
{
protected static $stack;
public static function setUpBeforeClass()
{
Database::getInstance()->connect();
$this->stack = new Transaction(123456789);
}
public function testInsert()
{
$data['name'] = 'Omega';
$this->stack->set($data);
$this->assertTrue($this->stack->save());
}
/**
* @depends testInsert
*/
public function testUpdate()
{
$object = PHPUnitReflectionClass::getInstance($this->stack);
$this->assertEquals(array('name' , 'Omega'), $object->getProperty('name'));
}
}
Надеюсь это поможет
Модульные тесты должны не зависит от других тестов, это считается плохой практикой. Суть модульных тестов заключается в том, что они проводятся в контролируемой и изолированной среде. setUp()
а также tearDown()
методы вызываются соответственно до и после каждый Метод испытания. И, таким образом, ваш $stack
свойство перезаписывается перед каждым тестом. Это также указано в документе, на который вы ссылаетесь (чуть ниже примера 4.1):
setUp()
а также tearDown()
методы шаблона запускаются один раз для каждого метода тестирования (и для свежих экземпляров) класса тестового примера.
(Вы также предполагаете, что методы в вашем тестовом классе выполняются в том же порядке, в котором они написаны, но это не обязательно так. В большинстве случаев они выполняются в том же порядке, но вы можете не зависит от этого.)