2014-04-02 63 views
3

我想功能測試期間禁用「軟可刪除的」過濾器和我做如下:禁用軟過濾器可刪除硬刪除記錄不起作用

第一種選擇:嘗試在tearDown()在禁用我的測試:

protected function tearDown() { 
    parent::tearDown(); 

    $entityUser = $this->em->getRepository("UserSecurityBundle:User")->find($this->user->getUser()->getId()); 

    $filter = $this->em->getFilters()->disable('softdeleteable'); 

    $this->em->remove($entityUser); 
    $this->em->flush(); 
    $this->em->close(); 
} 

沒有工作。

第二個選擇:做一個doctrine_test.yml和進口在config_test.yml:

imports: 
    - { resource: config.yml } 
    - { resource: doctrine_test.yml } 
    - { resource: security_test.yml } 

在這種情況下,我刪除doctrine.yml和包括config_prod.yml

沒有工作。

這是怎麼我的doctrine_test.yml節的樣子:

filters: 
    softdeleteable: 
     class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter 
     enabled: false 

第三種選擇:在setUp()禁用過濾:

public function setUp() { 
    static::$kernel = static::createKernel(); 
    static::$kernel->boot(); 
    $this->em = static::$kernel->getContainer()->get('doctrine')->getManager(); 

    $fixture = new LoadFeeData(); 
    $fixture->load($this->em); 

    $this->em->getFilters()->disable('softdeleteable'); 
    $this->user = $this->createUser(); 

    parent::setUp(); 
} 

沒有工作。

有什麼建議嗎?解?

回答

6

所以經過一番研究,做更多的測試後,我找到了解決辦法,見下圖:

protected function tearDown() { 
    parent::tearDown(); 

    $entityAccount = $this->em->getRepository("UserSecurityBundle:Account")->find(array("id" => $this->user->getId(), "user" => $this->user->getUser()->getId())); 
    $entityUser = $entityAccount->getUser(); 

    $entityCompanyHasWtax = $this->em->getRepository("ApprovalBundle:CompanyHasWtax")->findOneBy(array("company" => $this->company, "wtax" => $this->fee, "user" => $this->user->getUser()->getId())); 

    foreach ($this->em->getEventManager()->getListeners() as $eventName => $listeners) { 
     foreach ($listeners as $listener) { 
      if ($listener instanceof \Gedmo\SoftDeleteable\SoftDeleteableListener) { 
       $this->em->getEventManager()->removeEventListener($eventName, $listener); 
      } 
     } 
    } 

    $this->em->remove($entityCompanyHasWtax); 
    $this->em->remove($entityAccount); 
    $this->em->remove($entityUser); 

    $this->em->flush(); 
    $this->em->close(); 
} 

Aparently學說有一個錯誤,因爲以這種方式禁用濾波器:

$this->em->getFilters()->disable('softdeleteable'); 

隱而不宣」 t工作,爲他人好看

+1

我不認爲這是一個錯誤。在我的理解中,'$ this-> em-> getFilters() - > disable('softdeleteable');'只會禁用檢索軟刪除實體的過濾器。另請參閱https://stackoverflow.com/a/35459837/2564552 – spackmat

-1

雖然這個問題有點老了,也許對某人有用:

創建自己的事件偵聽器可能是一個更好的解決方案:

class SoftDeleteableListener extends BaseSoftDeleteableListener 
{ 

/** 
* @inheritdoc 
*/ 
public function onFlush(EventArgs $args) 
{ 
    $ea = $this->getEventAdapter($args); 
    $om = $ea->getObjectManager(); 
    //return from event listener if you disabled filter: $em->getFilters()->disable('softdeleteable'); 
    if (!$om->getFilters()->isEnabled('softdeleteable')) { 
     return; 
    } 

    parent::onFlush($args); 
} 

} 

和添加在你的配置:

gedmo.listener.softdeleteable: 
    class: AppBundle\EventListener\SoftDeleteableListener 
    tags: 
     - { name: doctrine.event_subscriber, connection: default } 
    calls: 
     - [ setAnnotationReader, [ @annotation_reader ] ] 

來源:https://github.com/Atlantic18/DoctrineExtensions/issues/1175