phpphpunitprophecy

How to test the order of parameters passed to an object constructed by a method


I'm testing a simple factory class with a single method which returns a TagModel.

class TagFactory
{
    public function buildFromArray(array $tagData)
    {
        return new TagModel(
            $tagData['t_id'],
            $tagData['t_promotion_id'],
            $tagData['t_type_id'],
            $tagData['t_value']
        );
    }
}

I can test the method…

public function testbuildFromArray()
{
    $tagData = [
        't_id' => 1,
        't_promotion_id' => 2,
        't_type_id' => 3,
        't_value' => 'You are valued',
    ];    

    $tagFactory = new TagFactory();
    $result = $tagFactory->buildFromArray($tagData);
    $this->assertInstanceOf(TagModel::class, $result);
}

If I change the order of the parameters in new TagModel… the test will still pass.

If I prophesize the TagModel

$tagModel = $this->prophesize(TagModel::class);
    $tagModel->willBeConstructedWith(
        [
            $tagData['t_id'],
            $tagData['t_promotion_id'],
            $tagData['t_type_id'],
            $tagData['t_value']
        ]
    );

… but what should I then be asserting? assertSame doesn't work because they aren't.

I could test the order with the getters from the TagModel but then I've gone beyond testing just this unit. Yet I do feel that the order should be tested because if I change them the test still passes.


Solution

  • The method you're testing is a factory. It creates an object. If making sure it's of the expected type is not enough for you, you need to verify its state. Either inspect it with getters, or create an object you're expecting to receive and use assertEquals() to compare it.