Symfony2 - PHPunit - 调用事件订阅者的测试方法

时间:2015-11-18 11:11:26

标签: php unit-testing symfony testing phpunit

以下是'测试'的事件订阅者。实体。我有代码分配合同,当发生这种情况时需要发送电子邮件。以下代码将发送电子邮件。我的问题是正确的测试,以确保方法' sendContractAssignedEmail'如果测试实体的合同属性从null

更改,则运行
class TestEventSubscriber implements EventSubscriber
{
    function __construct(Container $container)
    {
        $this->container = $container        
    }

    function getSubscribedEvents()
    {
        return array(
            Events::postUpdate,
        );
    }

    public function postUpdate(LifecycleEventArgs $args)
    {

    $entity = $args->getEntity();
    $changeSet = $args->getEntityManager()->getUnitOfWork()->getEntityChangeSet( $entity);

    if ($entity instanceof Test && isset($changeSet['contract']) && empty($changeSet['contract'][0]))
        $this->sendContractAssignedEmail($lead);

    }

    private function sendContractAssignedEmail(Test $test)
    {
        //irrelevant code to send email 
    }

}

我有一个在testHandler上分配合约的函数

public function assign(Test $test, Contract $contract) {

    if (is_null($test->getContract())) {
        $test->setContract($contract);
    }

    return $test;
}

这是从testController调用的,它会触发postUpdate事件并发送电子邮件。我真的很挣扎如何使用PHPunit测试这个?我已经阅读了很多,但它似乎都不适合我需要的东西。我看着嘲笑,但我不确定我是否正确理解

public function testEmailSentOnAssignTest() 
    $test = $this->testRepo->getOne(1);
    $objectManager = $this->getObjectManager();

    $mock = $this->getMockBuilder('Test\TestBundle\EventSubscriber\TestEventsSubscriber')
            ->disableOriginalConstructor()
            ->setMethods(array('sendContractAssignedEmail'))
            ->getMock();

    $args = new LifecycleEventArgs($lead, $objectManager);
    $mock->expects($this->once())->method('sendContractAssignedEmail');
    $mock->postUpdate($args);

}

我明白为什么上述情况不起作用。更新后的功能会查找对合同属性的更改,但不会对其进行更改,因此永远不会运行电子邮件功能。我可以以某种方式伪造EntityChangeSet或测试此事件的最佳方法是什么?我对单元测试非常陌生,请原谅我,如果我离开里程!

0 个答案:

没有答案