Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用事件订阅服务器上的Symfony2-PHPunit-test方法_Php_Unit Testing_Symfony_Testing_Phpunit - Fatal编程技术网

调用事件订阅服务器上的Symfony2-PHPunit-test方法

调用事件订阅服务器上的Symfony2-PHPunit-test方法,php,unit-testing,symfony,testing,phpunit,Php,Unit Testing,Symfony,Testing,Phpunit,下面是“测试”实体的事件订阅服务器。我有分配合同的代码,发生这种情况时需要发送电子邮件。下面的代码将发送电子邮件。我的问题是纠正一个测试,如果测试实体的contract属性从null更改为null,则确保方法“sendcontractsignedemail”已运行 class TestEventSubscriber implements EventSubscriber { function __construct(Container $container) { $

下面是“测试”实体的事件订阅服务器。我有分配合同的代码,发生这种情况时需要发送电子邮件。下面的代码将发送电子邮件。我的问题是纠正一个测试,如果测试实体的contract属性从null更改为null,则确保方法“sendcontractsignedemail”已运行

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,或者测试此事件的最佳方法是什么?我对单元测试非常陌生,所以如果我不熟悉,请原谅

你是对的。模拟一个实体经理和一个工作单元,让uow返回一个假变更集。也许有点痛,但你最终得到了一个很好的测试。顺便说一句,我发现预言方法虽然没有很好的文档记录,但似乎更容易使用。但那只是一个意见。谢谢你的帮助,我现在已经设法走得更远了。唯一的问题是“expects”方法似乎没有达到我想要的效果。它说该方法从未被调用,但如果我在代码中加入一些断点,它肯定会调用此方法:/这是因为我正在测试该方法,以查看其调用是否是私有的。从全局的角度来看,我能做些什么吗?应该没有必要测试私有方法。您也不应该嘲笑正在测试的类。我们假设一个mailer对象正被用来发送电子邮件。这是应该嘲笑的。并尽量避免注入整个容器。只要注射它需要的,你是正确的。模拟一个实体经理和一个工作单元,让uow返回一个假变更集。也许有点痛,但你最终得到了一个很好的测试。顺便说一句,我发现预言方法虽然没有很好的文档记录,但似乎更容易使用。但那只是一个意见。谢谢你的帮助,我现在已经设法走得更远了。唯一的问题是“expects”方法似乎没有达到我想要的效果。它说该方法从未被调用,但如果我在代码中加入一些断点,它肯定会调用此方法:/这是因为我正在测试该方法,以查看其调用是否是私有的。从全局的角度来看,我能做些什么吗?应该没有必要测试私有方法。您也不应该嘲笑正在测试的类。我们假设一个mailer对象正被用来发送电子邮件。这是应该嘲笑的。并尽量避免注入整个容器。只要注射它所需要的。