Почему мой стек PHPUnit Fixtures не работает должным образом?

Я читаю этот руководство, но я не понимаю, почему $ 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 в следующей функции. И это еще одна вещь, которую я не понимаю.

0

Решение

Проблемы:

  1. метод установки вызывается перед каждым вызовом метода тестирования;
  2. ваш тест зависит друг от друга.

Для первая проблема Вы можете использовать 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'));
}
}

Надеюсь это поможет

1

Другие решения

Модульные тесты должны не зависит от других тестов, это считается плохой практикой. Суть модульных тестов заключается в том, что они проводятся в контролируемой и изолированной среде. setUp() а также tearDown() методы вызываются соответственно до и после каждый Метод испытания. И, таким образом, ваш $stack свойство перезаписывается перед каждым тестом. Это также указано в документе, на который вы ссылаетесь (чуть ниже примера 4.1):

setUp() а также tearDown() методы шаблона запускаются один раз для каждого метода тестирования (и для свежих экземпляров) класса тестового примера.

(Вы также предполагаете, что методы в вашем тестовом классе выполняются в том же порядке, в котором они написаны, но это не обязательно так. В большинстве случаев они выполняются в том же порядке, но вы можете не зависит от этого.)

1

По вопросам рекламы [email protected]