AgmLauncher
AgmLauncher

Reputation: 7270

Test contents of return array in PHPSpec

Say I have this method of a RuleFactory:

public function makeFromArray($rules)
{
    $array = [];
    foreach ($rules as $rule) {
        $array[] = new Rule($rule[0], $rule[1]);
    }

    return $array;
}

I want to test that the return array contains Rule elements. Here is my test:

function it_should_create_multiple_rules_at_once()
{
    $rules = [
        ['required', 'Please provide your first name'],
        ['alpha', 'Please provide a valid first name']
    ];

    $this->makeFromArray($rules)->shouldHaveCount(2);
    $this->makeFromArray($rules)[0]->shouldBeInstanceOf('Rule');
    $this->makeFromArray($rules)[1]->shouldBeInstanceOf('Rule');
}

But this does not work, it throws an error in PHPSpec.

The strange thing is that I can do this just fine on other methods that return arrays, but for some reason I cannot do that here.

The error I get is this:

! it should create multiple rules at once
      method [array:2] not found

How do I test the contents of this return array, WITHOUT creating my own inline matcher?

Upvotes: 1

Views: 3087

Answers (1)

Jakub Zalas
Jakub Zalas

Reputation: 36211

Your method accepts a single rule, not all of them. The spec should be:

$this->makeFromArray($rules)->shouldHaveCount(2);
$this->makeFromArray($rules[0])[0]->shouldBeAnInstanceOf('Rule');
$this->makeFromArray($rules[1])[1]->shouldBeAnInstanceOf('Rule');

Or, to avoid multiple calls:

$rules = $this->makeFromArray($rules);
$rules->shouldHaveCount(2);
$rules[0]->shouldBeAnInstanceOf('Rule');
$rules[1]->shouldBeAnInstanceOf('Rule');

Still, the most readable version would be the one leveraging a custom matcher:

$rules->shouldHaveCount(2);
$rules->shouldContainOnlyInstancesOf('Rule');

Upvotes: 2

Related Questions