2014-08-31 3 views
0

Скажем, у меня есть этот метод в RuleFactory:Тестовые содержимое возвращаемого массива в PHPSpec

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

    return $array; 
} 

Я хочу, чтобы проверить, что возвращение массив содержит элементы Rule. Вот мой тест:

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'); 
} 

Но это не работает, оно вызывает ошибку в PHPSpec.

Странно, что я могу сделать это просто отлично на других методах, возвращающих массивы, но по какой-то причине я не могу этого сделать.

Ошибки я получаю это:

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

Как проверить содержимое этого возвращаемого массива, не создавая свой собственный встроенный Искатель?

+0

Если "альфа" означает «допускать только буквенные символы», а затем - даже если это относится к юникоду - вы все равно исключаете таких людей, как https://en.wikipedia.org/wiki/Jean-Paul_Gaultier; постарайтесь быть более либеральными в вашей проверке персональных данных. –

ответ

1

Ваш метод принимает одно правило, а не все из них. В спецификации должна быть:

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

Или, чтобы избежать несколько вызовов:

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

Тем не менее, наиболее читаемый вариантом будет один используя пользовательский Искатель:

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