【问题标题】:PHPUnit willReturnMap method - callback argumentPHPUnit willReturnMap 方法 - 回调参数
【发布时间】:2015-01-16 15:50:20
【问题描述】:

我的用例更复杂,但为了简单起见:

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 

【问题讨论】:

    标签: php mocking phpunit


    【解决方案1】:

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

    【讨论】:

    • 实际上可以,但问题出在其他地方。显然我不是在测试模拟,而是使用模拟方法的方法,并且它内部有自己的回调。
    • 用另一种检查参数的方式编辑答案
    猜你喜欢
    • 2020-09-15
    • 2011-08-24
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    相关资源
    最近更新 更多