簡體   English   中英

使用PHPUnit忽略exit()和die()

[英]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');

這模擬了在最頂層捕獲的exitdie 您的程序似乎會像以前一樣退出,現在可以測試而不會殺死整個測試套件。 唯一的問題是,如果您在現有代碼中捕獲其他普通的Exception ,在這種情況下,您將不得不修改代碼以重新拋出DieException / ExitException ,直到它們達到頂級。

另一種選擇是干凈地返回,這可能涉及重寫你的很多代碼。 即,如果你沒有在那時退出,為什么你的程序會產生進一步的輸出? 它應該盡早檢查是否需要“提前退出”,然后只需調用該代碼並流向程序的自然結束。

如果您必須處理第三方庫或其他您不應該或不能更改的代碼,這個問題會變得更加困難,但除非他們自己進行單元測試,否則沒有為它們編寫測試的價值,因為理想情況下,您不應該更改第三方代碼以避免將來的兼容性問題。 一個寫得很好的第三方圖書館永遠不應die 它應始終將控制權返回給調用程序,或者拋出可以捕獲的Exception

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM