PHPUnit метод willReturnMap — аргумент обратного вызова

Мой вариант использования более сложный, но для простоты:

class MockObject {
public function test($param1, callable $callback = null) {
return is_null($callback) ? $param1 : $callback($param1);
}
}

Я хотел бы смоделировать этот класс для других моих тестов, используя returnMap.

$map = [
['a', null, 'a'],
['b', $WHAT_SHOULD_BE_HERE?, 'b']
];

$mock = $this->getMock('MockObject');
$mock->expects($this->atLeastOnce())->method('test')->willReturnMap($map);

$this->assertEquals('a', $mock->test('a')); // Works
$this->assertEquals('b', $mock->test('b', function($value){return $value})); // Doesn't work

0

Решение

Просто определите $callback и использовать его на карте и утверждение:

$callback = function($value) { return $value; };

$map = [
['a', null, 'a'],
['b', $callback, 'b']
];

$mock = $this->getMock('MockObject');
$mock->expects($this->atLeastOnce())->method('test')->will($this->returnValueMap($map));

$this->assertEquals('a', $mock->test('a')); // Works
$this->assertEquals('b', $mock->test('b', $callback)); // Should work

Вы можете лучше контролировать все случаи, используя функцию для вычисления возвращаемого значения:

$mock = $this->getMock('MockObject');
$mock->expects($this->atLeastOnce())
->method('test')
->will($this->returnCallback(function($param1, $param2) {
// return value depends on parameters
}));
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]