调用事件订阅服务器上的Symfony2-PHPunit-test方法
下面是“测试”实体的事件订阅服务器。我有分配合同的代码,发生这种情况时需要发送电子邮件。下面的代码将发送电子邮件。我的问题是纠正一个测试,如果测试实体的contract属性从null更改为null,则确保方法“sendcontractsignedemail”已运行调用事件订阅服务器上的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) { $
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对象正被用来发送电子邮件。这是应该嘲笑的。并尽量避免注入整个容器。只要注射它所需要的。