Дразнить серию методов с атумом

Я пытаюсь создать макет базы данных ($ db) с Atoum, который бы возвращал разные значения в зависимости от предыдущих вызовов методов (и аргументов).

Я использую 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, чтобы возвращать разные значения для каждого вызова, а затем проверить макет, чтобы убедиться, что он был вызван с правильными аргументами.

0

Решение

Я расскажу вам о ваших вопросах и надеюсь, что вы найдете способ решить их.

Таким образом, чтобы проверить, что фиктивный метод не вызывается, вы можете использовать ‘call’ с ‘never’

$this->mock($mock)->call('fetchAll')->never();

И называться

$this->mock($mock)->call('select')->once();

Чтобы иметь дело с ложным ответом, вы можете использовать несколько вещей, например:

$this->calling($db)->fetchAll[0] = null; // default answer
$this->calling($db)->fetchAll[1] = function () {....} // first call to method

Если вы хотите что-то похожее на цепочку: когда вы используете mocked-метод select, и внутри него мы вызываем метод fetchAll, тогда ответ … atoum пока не предлагает такого поведения. Лучше всего создать вопрос разоблачая ваше дело.

Когда вы используете «вызов», вы определяете поведение макета. Только когда метод вызывается, atoum все схватит и разрешит.

Так что для меня, если я правильно понимаю ваш вопрос, я напишу это так:

$this->calling($db)->fetchAll = function() use ($bind){
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;
};
$this->calling($db)->select = function($table, array $bind, $boolOperator = "AND") use ($permissionClientMapper, $db){
if($table === $permissionClientMapper->getTableName()){
return $db->fetchAll();
}
};
// this is the same as your code. But It a bit more readable

$this->newTestedInstance;
$this->testedInstance->setDb($db);
$this->variable($this->testedInstance->doTheCallThatReturnNull())
->isEqualTo(null);
// do some change in the vars to be in the value
$this->variable($this->testedInstance->doTheCallThatReturnValue())
->isEqualTo(EXPECTED_RETURN_VALUE);

PS: чтобы помочь вам идти дальше, вы можете прочитать http://docs.atoum.org/en/latest/asserters.html#mock а также http://docs.atoum.org/en/latest/mocking_systems.html
и вы также можете пометить вопрос с «atoum».

2

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

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