Hi
Can anyone help me on this. I have created the unit test for the observer class sales order . When I am running the Unit test I am getting below error I tried but didn’t get any solution.
There was 1 error: 1)
VendorNameModuleNameTestUnitObserverSalesOrderPlacedAfterObserverTest::testExecute
Error: Call to a member function getId() on null/var/www/html/vendor/VendorName/magento-module-ModuleName/src/Observer/SalesOrderPlacedAfterObserver.php:45
/var/www/html/vendor/VendorName/magento-module-ModuleName/src/Test/Unit/Observer/SalesOrderPlacedAfterObserverTest.php:84ERRORS! Tests: 1, Assertions: 0, Errors: 1.
Main Observer Class
<?php
declare(strict_types=1);
namespace VendorNameModuleNameObserver;
use VendorNameModuleNameHelperQueue as QueueHelper;
use VendorNameModuleNameHelperConnection as SFMCHelper;
use MagentoFrameworkEventManager;
use MagentoFrameworkEventObserverInterface;
class SalesOrderPlacedAfterObserver implements ObserverInterface
{
/**
* @var QueueHelper
*/
protected QueueHelper $queueHelper;
/**
* @var SFMCHelper
*/
protected SFMCHelper $sfmcHelper;
/**
* @param SFMCHelper $sfmcHelper
* @param QueueHelper $queueHelper
*/
public function __construct(
SFMCHelper $sfmcHelper,
QueueHelper $queueHelper
) {
$this->sfmcHelper = $sfmcHelper;
$this->queueHelper = $queueHelper;
}
/**
* Order save after event handler
*
* @param MagentoFrameworkEventObserver $observer
* @return void
*/
public function execute(MagentoFrameworkEventObserver $observer)
{
$lastOrderId = $observer->getEvent()->getData('order');
$orderId = $lastOrderId->getId();
if ($orderId && $this->sfmcHelper->isAutoSyncEnabled()) {
$this->queueHelper->publishSFMCMessage($orderId, QueueHelper::SFMC_EVENT_ORDER_UPDATE);
}
}
}
Unit Test Class
<?php
declare(strict_types=1);
namespace VendorNameModuleNameTestUnitObserver;
use MagentoSalesModelOrder;
use MagentoFrameworkEvent;
use MagentoFrameworkEventObserver;
use VendorNameModuleNameObserverSalesOrderPlacedAfterObserver;
use VendorNameModuleNameHelperConnection as SFMCHelper;
use VendorNameModuleNameHelperQueue as QueueHelper;
class SalesOrderPlacedAfterObserverTest extends PHPUnitFrameworkTestCase
{
/**
* @var SalesOrderPlacedAfterObserver
*/
protected $salesorderplacedafterObserver;
/**
* @var SFMCHelper
*/
protected $sfmcHelper;
/**
* @var QueueHelper
*/
protected $queueHelper;
/**
* @var Observer
*/
protected $observer;
/**
* @return void
*/
public function setUp(): void
{
$this->observer = $this->createMock(Observer::class);
$this->_eventMock = $this->getMockBuilder(Event::class)
->addMethods(['getOrder', 'getId'])
->disableOriginalConstructor()
->getMock();
$this->observer->expects($this->any())->method('getEvent')->willReturn($this->_eventMock);
$this->sfmcHelper = $this->createMock(SFMCHelper::class);
$this->queueHelper = $this->createMock(QueueHelper::class);
$this->salesorderplacedafterObserver = new SalesOrderPlacedAfterObserver(
$this->sfmcHelper,
$this->queueHelper
);
}
/**
* @return void
*/
public function testExecute()
{
$orderId = '1';
$orderMock = $this->createPartialMock(
MagentoSalesModelOrder::class,
['getId']
);
$this->_eventMock->expects($this->once())->method('getOrder')->willReturn($orderMock);
$orderMock->expects($this->once())->method('getId')->willReturn($orderId);
// I assume this value should be true
// Implement to fit you method return value
$this->sfmcHelper->expects(self::once())
->method('isAutoSyncEnabled')
->willReturn(true);
// Can be useless depend on your method utility
$this->queueHelper->expects(self::once())
->method('publishSFMCMessage')
->with($orderId, QueueHelper::SFMC_EVENT_ORDER_UPDATE);
$this->salesorderplacedafterObserver->execute($this->observer);
}
}