Magento – Unit Test for overwrite collection class in magento2

magento2unit tests

Suppose I overwrite 'Magento\Sales\Model\Resource\Order\Collection' to 'SR\RewriteSales\Model\Resource\Order\Collection', code looks like

public function addFieldToFilter($field, $condition = null)
    {
        // custom condition applied here

        return parent::addFieldToFilter($field, $condition);
    }

Now I need some test case for 'AddFieldToFilter' method.

I create a file inside SR\RewriteSales\Test\Unit\Model\Resource\Order\CollectionTest.php
code looks like

class CollectionTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var Collection|\PHPUnit_Framework_MockObject_MockObject
     */
    protected $collection;

    /**
     * @var \Magento\Framework\DB\Select|\PHPUnit_Framework_MockObject_MockObject
     */
    protected $select;

    protected function setUp()
    {
        $this->select = $this->getMockBuilder('Magento\Framework\DB\Select')
            ->disableOriginalConstructor()
            ->getMock();

        $connection = $this->getMockBuilder('Magento\Framework\DB\Adapter\Pdo\Mysql')
            ->disableOriginalConstructor()
            ->getMock();
        $connection->expects($this->any())
            ->method('select')
            ->will($this->returnValue($this->select));

        $resource = $this->getMockBuilder('Magento\Framework\Model\Resource\Db\AbstractDb')
            ->disableOriginalConstructor()
            ->setMethods(['__wakeup', 'getReadConnection'])
            ->getMockForAbstractClass();
        $resource->expects($this->any())
            ->method('getReadConnection')
            ->will($this->returnValue($connection));

        $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
        $arguments = $objectManagerHelper->getConstructArguments(
            'SR\RewriteSales\Model\Resource\Order\Collection',
            ['resource' => $resource, 'connection' => $connection]
        );

        $this->collection = $this->getMockBuilder('SR\RewriteSales\Model\Resource\Order\Collection')
            ->setConstructorArgs($arguments)
            ->setMethods(['addFilter', '_translateCondition', 'getMainTable', '__wakeup'])
            ->getMock();
    }

    public function testAddFieldToFilter()
    {

    }
}

It's come following error-> "RuntimeException: ObjectManager isn't initialized".

Is that possible to create some test case for overwrite class?

Best Answer

First of all better to do not mock class under test.

Second one, better to use plugins instead of class overwrite.

And last, you must pass all parameters of parent constructor to your class.

Simplest way to instantiate class is using objectMangerHelper

    $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
    $this->collection = $objectManager->getObject(
        'SR\RewriteSales\Model\Resource\Order\Collection',
        [
            'resource' => $resource, 
            'connection' => $connection,

        ]
    );
Related Topic