2017-02-03 2 views
0

В моей LoadFixture.php я добавить ссылку на все мои светильники так:светильникам disapearing после одного теста

public function load(ObjectManager $manager) { 
    $user = new user("Dummy"); 
    $this->persist($user); 
    $this->addReference("user", $user); 
} 

В моем тестовом классе я загружаю их, как это:

public function setUp() { 
     if(self::$do_setup){ 
      $this->loadFixtures(array(
       "Bundle\\Tests\\Fixtures\\LoadUser" 
      )) ; 
     } 
} 

в моих тестах я использую их, как это:

public function testOne() { 
    $client = $this->createClient($this->getReference("user_a")); 
    $client->request('GET', '/'); 
    $this->assertStatusCode(200, $client); 
    self::$do_setup=false; 
} 

public function testTwo() { 
    $client = $this->createClient($this->getReference("user_a")); 
    $client->request('GET', '/home'); 
    $this->assertStatusCode(200, $client); 
} 

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

Но если я не выполнять setUp() в моем testTwo, в то время как мои светильники в моей базе данных, $this->getReference("user_a") дает мне ошибку:

Call to a member function getReferenceRepository() on a non-object 

Как я могу решить это?

UPDATE
Я нашел решение. Поэтому я отправляю его здесь, на случай, если кто-то столкнется с той же проблемой, что и я. Большое спасибо @Damien Flament за его ответ, учитывая тот факт, что TestCase удаляется после каждого теста.

Я сменил название своего метода setUp() на open() и мой tearDown() метод до close(). Первый метод класса вызывает метод open(), а теперь возвращает $this. Следующий метод записывается в память @depends testOne и принимает параметр. С помощью этого параметра я могу снова использовать свои ссылки. Ex:

// new setUp Metod 
public function open() { 
     if(self::$do_setup){ 
      $this->loadFixtures(array(
       "Bundle\\Tests\\Fixtures\\LoadUser" 
      )) ; 
     } 
} 
//new tearDown method 
public function close() { 
    $this->getContainer()->get('doctrine.orm.entity_manager')->getConnection()->close(); 
} 
public function testOne() { 
    $this->open(); 
    $client = $this->createClient($this->getReference("user_a")); 
    $client->request('GET', '/'); 
    $this->assertStatusCode(200, $client); 
    return $this; 
} 
/** 
* @depends testOne 
*/ 
public function testTwo($it) { 
    $client = $this->createClient($it->getReference("user_a")); 
    $client->request('GET', '/home'); 
    $this->assertStatusCode(200, $client); 
    return $it; 
} 
/** 
* @depends testTwo 
*/ 
public function testThree($it) { 
    $client = $this->createClient($it->getReference("user_a")); 
    $client->request('GET', '/about'); 
    $this->assertStatusCode(200, $client); 
    $this->close(); 
} 
+0

Пожалуйста, отредактируйте и обновите исходный вопрос («Проблема создания ссылок на инструменты доктрины в статическом контексте») вместо создания нового. – aferber

ответ

1

Я думаю, что TestCase объект удаляется и воссоздается PHPUnit (я не читал исходный PHPUnit код, но я думаю, что это более легкий способ сбросить среды тестирования для каждого теста).

Таким образом, ваш объект (возможно, ссылающийся на атрибут объекта тестового класса), вероятно, собран из мусора.

Чтобы установить прибор на один класс испытаний, используйте метод TestCase :: setUpBeforeClass().

См. documention on "Sharing fixtures".

+0

Спасибо за ваш ответ. Проблема в том, что я использую специальный класс для создания своих светильников. Поэтому я не смог бы использовать метод 'setUpBeforeClass'. – Asew

+0

Я нашел решение и отредактировал свое оригинальное сообщение, спасибо за то, что объект TestCase удален и воссоздан PHPUnit. – Asew