PHPUnit willReturnMap方法-回调参数

PHPUnit willReturnMap方法-回调参数,php,mocking,phpunit,Php,Mocking,Phpunit,我的用例更复杂,但为了保持简单: class MockObject { public function test($param1, callable $callback = null) { return is_null($callback) ? $param1 : $callback($param1); } } 我想用returnMap模拟这个类进行其他测试 $map = [ ['a', null, 'a'], ['b', $WHAT_SHOUL

我的用例更复杂,但为了保持简单:

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 

只需定义一个
$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
     }));    

只需定义一个
$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
     }));    

事实上,这是可行的,但问题出在别处。很明显,我不是在测试mock,而是在测试使用mock方法的方法,它内部有自己的回调。用另一种方法检查参数编辑的答案实际上是可行的,但问题在别处。显然,我不是在测试mock,而是在测试使用mock方法的方法,该方法内部有自己的回调函数