[英]Ignore exit() and die() with PHPUnit
首先,標題會暗示這是這個或這個的重復,但由於幾個原因,這些答案對我不起作用,即使我最初的問題是相同的。 我會解釋原因。
我的問題是:我在我的代碼中有幾次我想發送標題和正文然后終止處理。 與其他問題不同,我不能使用return
或拋出異常(這些顯然是為出於不同目的設計的不同函數而不是退出,這不是錯誤;它只是在某些特定情況下的早期運行時終止)。
仍然,我想編寫運行這些方法的單元測試,確保設置了適當的頭文件( 此處找到解決方案),輸出主體是正確的(在測試用例中使用$this->expectOutputString()
- 方法解決)然后繼續測試。 在兩者之間, exit
將發生。
我已經在PHPUnit中嘗試了@runInSeparateProcess
-annotation,我也檢查了test_helpers擴展,它有效,但我不想添加另一個擴展(建議測試也將在生產中運行)打破一切的本機PHP代碼行。 必須有一種更簡單的方法而不犧牲最佳實踐。
有沒有人有這個問題的好方法?
我在引導程序中添加了一個變量,我可以在代碼中引用一個IF,在那些我不需要退出的極少數情況下。
define ('PHPUNIT_RUNNING', 1);
正常計划:
if(! @PHPUNIT_RUNNING === 1 )
{
exit;
}
PHPUnit沒有被定義為規則,所以在PHP執行中會產生一個警告(我們用@隱藏它。然后代碼將在不處於測試模式時執行我們想要的操作。這是在主代碼寫入之后添加的我們將PHPUnit測試添加到現有項目中,而不是執行TDD。
請注意:
我們盡可能少地解決遺留問題,否則我們會像其他人一樣建議並拋出異常或將數據返回到父函數。
我剛剛測試了以下想法:
ExitException.php:
<?php
class DieException extends Exception {} // for those people who like die as well as exit
class ExitException extends Exception {}
entrypoint.php:
<?php
require_once 'ExitException.php';
try {
require 'main_code.php';
run_main_code();
}
catch (DieException $e) {
return $e->getMessage();
}
catch (ExitException $e) {
return $e->getMessage();
}
其中幾個include
:
deepcode.php
<?php
throw new ExitException('Exiting normally');
這模擬了在最頂層捕獲的exit
或die
。 您的程序似乎會像以前一樣退出,現在可以測試而不會殺死整個測試套件。 唯一的問題是,如果您在現有代碼中捕獲其他普通的Exception
,在這種情況下,您將不得不修改代碼以重新拋出DieException
/ ExitException
,直到它們達到頂級。
另一種選擇是干凈地返回,這可能涉及重寫你的很多代碼。 即,如果你沒有在那時退出,為什么你的程序會產生進一步的輸出? 它應該盡早檢查是否需要“提前退出”,然后只需調用該代碼並流向程序的自然結束。
如果您必須處理第三方庫或其他您不應該或不能更改的代碼,這個問題會變得更加困難,但除非他們自己進行單元測試,否則沒有為它們編寫測試的價值,因為理想情況下,您不應該更改第三方代碼以避免將來的兼容性問題。 一個寫得很好的第三方圖書館永遠不應die
。 它應始終將控制權返回給調用程序,或者拋出可以捕獲的Exception
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.