我想單元測試一個PHP應用程序。 我也是新的單元測試,也許這不應該是我的第一個單元測試用例之一,但我仍然需要做到這一點,所以...如何單元測試一個PHP命令類
我有一個PHP命令2類方法和__construct()。 執行方法遍歷一個數組(通過DBAL讀取獲得)並調用executeSingleRow讀取數據庫時會考慮一些問題,並且只要滿足幾個條件,就會調用另一個命令的execute方法。
我只是無法弄清楚如何一個好的單元測試可以在這裏做,或者我應該如何修改代碼。
這裏是我的類方法:
public function __construct(
$registry,
$firstTableRepository,
$secondTableRepository,
AnotherCommand $anotherCommand,
JobLogRepository $logger = null
)
{
$this->registry = $registry;
$this->stagione = $this->registry->get('stagione');
$this->firstTableRepository = $firstTableRepository;
$this->secondTableRepository = $secondTableRepository;
$this->anotherCommand= $anotherCommand;
$this->logger = $logger;
$this->error = false;
}
public function execute($toReplace, $replacer, $selected)
{
foreach ($selected as $selectedRow) {
firstTableID = $selectedRow['ID'];
$this->executeSingleRow($toReplace, $replacer, firstTableID);
}
if ($this->error) {
$this->keyException(null, 'Procedura terminata con errori');
}
}
public function executeSingleRow($toReplace, $replacer, firstTableID)
{
if ($toReplace == $replacer) {
$this->error = true;
} else {
$firstTableRow = $this->firstTableRepository->readByID(firstTableID);
if (!empty($firstTableRow)) {
$CODE = $firstTableRow['CODE'];
$newCODE = str_replace($toReplace, $replacer, $CODE);
if ($newCODE != $CODE) {
$articoloNuovo = $this->secondTableRepository->readByCode($newCODE);
if ($articoloNuovo) {
$secondTableIDNuovo = $articoloNuovo['secondTableID'];
try {
$this->anotherCommand->setJobLog($this->jobLog);
$this->anotherCommand->execute($secondTableIDNuovo, 'G', firstTableID);
return;
} catch (\Exception $e) {
$this->error = true;
}
} else {
$this->error = true;
}
} else {
$this->error = true;
}
} else {
$this->error = true;
}
}
}
非常感謝這麼樣的閱讀和可能的話回答!
這是非常難以確定這個命令的作用,因此變得很難知道什麼是重要的測試。我想你想確保給定一個對象狀態,執行正確的命令。然而,由於你目前的實施很大程度上依賴於數據庫,你正在嘲笑地獄。我不會試圖單獨測試這個類,它似乎一次嘗試太多東西。 – k0pernikus
有一件事我在我的經驗教訓,如果你想進行單元測試您的應用程序,寫代碼不是之後有一個名爲TDD技術,該技術將迫使你寫鬆耦合類,這將是更容易測試之前做。編寫代碼後編寫測試是一個拖動... –