Как бы вы протестировали этот тип функции?
public function import(int $id, array $fields, string $data) {
try {
$file = $this->writeTemporaryFile(string $data);
if (!$this->getStorage()->ping()) {
throw new \Exception('Unable ping storage');
}
$result = $this->getStorage()->importFromFile($fields, $file);
if (!$result) {
throw new \Exception('Unable to write to storage');
}
$this->getAnotherStorage()->ok($id);
return true;
} catch (\Throwable $e) {
$this->log($e);
$this->failsafe($data);
return false;
}
}
У меня есть фиктивные объекты и заглушки для объектов, возвращаемых $this->getStorage()
и $this->getAnotherStorage()
. Есть заглушки для $this->getStorage()->ping()
и $this->getAnotherStorage()->ok()
и т. Д.
Итак, вопросы:
а) На какие моменты вы обращаете внимание? Будете ли вы проверять возможные исключения для всех методов или просто будете проверять результат самого метода import
?
б) Как вы организуете код вашего юнит-теста? Большой толстый одиночный метод ...
public function testImport(): void {
//here goes a big fat testing method
}
или один метод, вызывающий защищенные методы, по одному на каждый случай?
public function testImport(): void {
$this->examineWritingToFile();
$this->examineFailedPing();
$this->examineSavingToStorageFromFile();
//etc.
}