10/01/2017 - PHPSPEC, SYMFONY
Symfony içinde phpspec ile preUpdate event listenerleri test etmek isterseniz aşağıdaki gösterilen basit bir örneği kullanabilirsiniz.
namespace My\ProductBundle\EventListener;
use Doctrine\ORM\Event\PreUpdateEventArgs;
use My\ProductBundle\Entity\Product;
class ProductEventListener
{
/**
* @param PreUpdateEventArgs $event
*/
public function preUpdate(PreUpdateEventArgs $event)
{
$entity = $event->getObject();
if ($entity instanceof Product) {
if ($event->hasChangedField('price')) {
if ($event->getOldValue('price') != $event->getNewValue('price')) {
$this->capturePriceChange($entity, $event->getNewValue('price'));
}
}
}
}
/**
* @param string $newPrice
* @param Product $product
*/
private function capturePriceChange(Product $product, $newPrice)
{
// Do something with $product and $newPrice here
}
}
namespace spec\My\ProductBundle\EventListener;
use Doctrine\ORM\Event\PreUpdateEventArgs;
use My\ProductBundle\Entity\Product;
use PhpSpec\ObjectBehavior;
class ProductEventListenerSpec extends ObjectBehavior
{
function it_should_not_capture_price_change_in_the_case_of_no_change_on_pre_update_event(
PreUpdateEventArgs $event,
Product $product
) {
$old = 123;
$new = 123;
$hasPriceChanged = false;
$event->getObject()->shouldBeCalled()->willReturn($product);
$event->hasChangedField("price")->shouldBeCalled()->willReturn($hasPriceChanged);
$event->getOldValue("price")->shouldNotBeCalled()->willReturn($old);
$event->getNewValue("price")->shouldNotBeCalled()->willReturn($new);
// Do the same thing with $additionalData and $newPrice here as done in the listener
// You can use shouldBeCalled() and willReturn(...) or shouldNotBeCalled()
$this->preUpdate($event);
}
function it_should_capture_price_change_in_the_case_of_change_on_pre_update_event(
PreUpdateEventArgs $event,
Product $product
) {
$old = 123;
$new = 321;
$hasPriceChanged = true;
$event->getObject()->shouldBeCalled()->willReturn($product);
$event->hasChangedField("price")->shouldBeCalled()->willReturn($hasPriceChanged);
$event->getOldValue("price")->shouldBeCalled()->willReturn($old);
$event->getNewValue("price")->shouldBeCalled()->willReturn($new);
// Do the same thing with $additionalData and $newPrice here as done in the listener
// You can use shouldBeCalled() and willReturn(...) or shouldNotBeCalled()
$this->preUpdate($event);
}
}