以下是'测试'的事件订阅者。实体。我有代码分配合同,当发生这种情况时需要发送电子邮件。以下代码将发送电子邮件。我的问题是正确的测试,以确保方法' 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或测试此事件的最佳方法是什么?我对单元测试非常陌生,请原谅我,如果我离开里程!