2016-11-21 4 views
2

Я не понимаю поведение моего кода. Вот простой вариант:trait in phpunit TestCase

У меня есть тест:

class EditVoterTest extends TestCase 
{ 
    use ContainerAwareTrait; 

    protected function setUp() 
    { 
     $this->getContainer(); 
    } 

    public function testSomething() 
    { 
     // test lauched 4 times with a provider 
    } 
} 

и черта:

trait ContainerAwareTrait 
{ 
    private $container; 

    public function getContainer() 
    { 
     if (!$this->container) { 
      echo "NO CONTAINER \n"; 
      $this->container = true; 
     } 

     return $this->container; 
    } 
} 

и результат

PHPUnit 5.6.2 by Sebastian Bergmann and contributors. 

.NO CONTAINER 
.NO CONTAINER 
.NO CONTAINER 
.                4/4 (100%)NO CONTAINER 


Time: 241 ms, Memory: 21.00MB 

Почему контейнер «построить " каждый раз ?

+0

Я думаю, что для каждого теста, новый экземпляр тестового класса создается. –

+1

Для каждого теста PHPUnit будет запускать 'setUp()' –

+0

Как сказал @FelippeDuarte, 'setUp' - это метод, предназначенный для выполнения всех необходимых действий перед выполнением любого теста (инициализация объекта, подключение к ресурсу и т. Д.). Таким образом, как показывает единичный тест, каждый тест должен считаться уникальным, поэтому 'setUp' должен выполняться для каждого теста. –

ответ

0

В соответствии с документацией перед каждым тестом вызывается setUp(). Так что это обычное поведение и не связано с чертой. Попробуйте это:

public static function setUpBeforeClass() 
{ 
    $this->getContainer(); 
    echo "it's called once a class"; 
} 

protected function setUp() 
{ 
    $this->getContainer(); 
    echo "it's called before each test"; 
} 

Реальная разница для признака начинается, когда вы хотите использовать его методы в поставщиках данных. Вероятно, вы получите сообщение об ошибке, поскольку этот метод неизвестен, поскольку поставщики данных загружаются перед конструктором. Это будет неудачу:

class EditVoterTest extends TestCase 
{ 
    use ContainerAwareTrait; 

    /** 
    * @dataProvider getData 
    */ 
    public function testSomething() 
    { 
     // test something 
    } 

    public function getData() 
    { 
     return $this->getContainer(); 
    } 
} 
Смежные вопросы