Как я могу использовать mockery и hamcrest, чтобы утверждать, что когда вызывается метод фиктивного объекта, один из переданных ему аргументов — это массив, содержащий пару ключ / значение?
Например, мой тестовый код может выглядеть так:
$mock = m::mock('\Jodes\MyClass');
$mock ->shouldReceive('myMethod')
->once()
->with(
arrayContainsPair('my_key', 'my_value')
);
Я знаю, что мог бы написать это с закрытием, но мне было просто интересно, есть ли другой способ сделать его немного лучше:
$mock ->shouldReceive('myMethod')
->once()
->with(
m::on(function($options){
return
is_array($options) &&
isset($options['my_key']) &&
$options['my_key'] == 'my_val';
})
);
Я нашел ответ, просматривая PHP-код Hamcrest здесь,
Имя функции указывается в комментарии к документу:
* @factory hasEntry
Так что мой код будет выглядеть так:
$mock ->shouldReceive('myMethod')
->once()
->with(
hasEntry('my_key', 'my_value')
);
Если вы заинтересованы в другом решении, вы можете проверить Узо издевается.
Просто вы можете сделать это:
//creating mock
$mock = Mock::create('MockTestClass');
//call mock
$mock->test(['key1' => 'value1', 'key2' => 'value2']);
//asserts (verification)
Mock::verify($mock)->test(Mock::argThat()->extractField('key1')->equals('value1'));
Mock::verify($mock)->test(Mock::argThat()->extractField('key2')->equals('value2'));