我正在尝试使用 Atoum 设计一个 Database($db) Mock,它会根据以前的方法调用(和参数)返回不同的值。
我正在使用 PHP 5.6 和 Atoum 3.2
这是我尝试过的:
$this->calling($db)->select = function($table, array $bind, $boolOperator = "AND") use ($permissionClientMapper, $db, $permissionsClientRaw){
if($table === $permissionClientMapper->getTableName()){
$this->calling($db)->fetchAll = function() use ($bind, $permissionsClientRaw){
if(array_key_exists('type_service', $bind) && array_key_exists('id_service', $bind) && $bind['type_service'] === 'mutu' && $bind['id_service'] === 4012){
return EXPECTED_RETURN_VALUE;
}
return null;
};
}
};
我会在调用时返回代码EXECTED_RETURN_VALUE
(带参数):
1/ $db->select() -> This method is called as expected
2/ $db->fetchAll() -> This one is never called
我在 Atoum 文档中没有找到任何这样的例子。
有人可以确认这是模拟连续方法调用的正确方法吗?
我还尝试在闭包中使用对数据库的引用
$this->calling($db)->select = function($table, array $bind, $boolOperator = "AND") use ($permissionClientMapper, &$db, $permissionsClientRaw){
if($table === $permissionClientMapper->getTableName()){
$this->calling($db)->fetchAll = function() use ($bind, $permissionsClientRaw){
if(array_key_exists('type_service', $bind) && array_key_exists('id_service', $bind) && $bind['type_service'] === 'mutu' && $bind['id_service'] === 4012){
return EXPECTED_RETURN_VALUE;
}
return null;
};
}
};
但这也不起作用。
编辑:一种解决方法可能是使用 atoum 调用顺序为每个调用返回不同的值,然后测试模拟以检查它是否使用正确的参数调用。