Method Chaining in PHP with PHPUnit test

Play this article

What is method chaining

Method chaining is where you can call multiple methods after one another in one line like so

$methodChain->addHelloToChain()->addSpaceToChain()->addThereToChain()->getOutputOfChain();

Let's write some code

Setup an initial class with this code which has a few methods that you can call.

<?php

namespace AzCodez\MagentoTraining\Controller\UnitTesting;

class MethodChainingTest
{
    public $outputOfChain = '';

    public function __construct()
    {
        $this->outputOfChain = '';
    }

    public function addHelloToChain()
    {
        $this->outputOfChain .= "hello";
        return $this;
    }

    public function addSpaceToChain()
    {
        $this->outputOfChain .= " ";
        return $this;
    }

    public function addThereToChain()
    {
        $this->outputOfChain .= "there";
        return $this;
    }

    public function addByeToChain()
    {
        $this->outputOfChain .= "bye";
        return $this;
    }

    public function addNowToChain()
    {
        $this->outputOfChain .= "now";
        return $this;
    }

    public function getOutputOfChain()
    {
        return $this->outputOfChain;
    }
}

The above four methods are what you call to make your chain.

  • addHelloToChain()
  • addSpaceToChain()
  • addThereToChain()
  • addByeToChain()

The last method getOutputOfChain() gets the output of the chain result.

Write a PHPUnit Test

Now we will write a PHP Unit test, call the chain, and test output. Explanation is in comment of code.

<?php

use PHPUnit\Framework\TestCase;
use AzCodez\MagentoTraining\Controller\UnitTesting\TestClassMethodChaining;

class TestMethodChaining extends TestCase
{
    /**
     * Unit test to check method chaining of calling addByeToChain + addNowToChain() + addNowToChain should result in 'bye now'
     */
    public function testMethodChaningHelloThere()
    {
        //Arrange
        $methodChain = new TestClassMethodChaining();

        //Act
        $result = $methodChain->addHelloToChain()->addSpaceToChain()->addThereToChain()->getOutputOfChain();

        // Asset
        $this->assertEquals('hello there', $result);

    }

    /**
     * Unit test to check method chaining of calling addByeToChain + addNowToChain() + addNowToChain should result in 'bye now'
     */
    public function testMethodChaningByeNow()
    {
        //Arrange
        $methodChain = new TestClassMethodChaining();

        //Act
        $result = $methodChain->addByeToChain()->addSpaceToChain()->addNowToChain()->getOutputOfChain();

        // Asset
        $this->assertEquals('bye now', $result);

    }
}

Run the tests

./vendor/bin/phpunit -c dev/tests/unit/phpunit.xml.dist app/code/AzCodez/MagentoTraining/Test/Unit/

Shameless Plugs

Credits

Feel free to comment with questions or feedback✌️

Happy coding,

Az 👨🏾‍💻

Did you find this article valuable?

Support Asrin Dayananda by becoming a sponsor. Any amount is appreciated!