2011-05-09 55 views
8

我使用PHPUnit的框架,我有這樣的代碼:的PHPUnit和模具功能

public function A() { 

try { 

    (...some code...) 

    die (json_encode ($data)); 

} 

catch (Exception $e) { 
    die(false); 
} 

} 

此功能是通過AJAX調用,我不能替換回報死。問題是: 如何使用這樣的代碼進行單元測試?

我不能用這個,斷言。

謝謝。

+0

這個問題不屬於StackOverflow嗎? – slubman 2011-05-09 10:24:07

+0

@slubman,是的,我認爲它確實如此。我有一個投票來遷移它。如果您將其標記爲移動,它將有助於更快地完成。 – Caleb 2011-05-09 10:28:25

+0

@doctore:請不要編輯以添加由於本網站的風格指南而被編輯出來的內容。閱讀http://tinyurl.com/so-hints關於如何提問的一些想法,但總而言之,在問題中提前加上感謝僅僅是對問題的分心;在這個社區中,你可以通過投票表示感謝,並通過幫助其他人回答問題。 – Caleb 2011-05-09 10:32:46

回答

17

不能測試...

有時候單元測試帶來了問題,這樣的(不可測的情況下)。這通常意味着問題不在於測試,而在於代碼和架構。

在這裏,你不應該使用die功能(實際上你不應該使用die返回一個HTTP響應),但echo的JSON,然後讓腳本完成正確(或return的JSON和echo它的地方其他)。

爲了測試這個,你可以捕獲輸出並檢查它(這是一個基本的例子,我猜測得好多了)。

結論:問題出在您的代碼上,修復此問題然後您可以嘗試測試它。如果你不能,那就不要測試。

+4

+1你比我更好。 「如果難以測試,則編碼嚴重。「 – 2011-05-09 11:25:10

+0

@Blowski:」如果它很難測試,它的編碼很糟糕。「我喜歡這個句子,聽到這句話總是令人失望(我曾多次遇到過這種情況),但總是這樣。 。好的編程很難;) – 2011-05-09 11:27:47

+0

+1我也是給我一個新的句子給我簽名:D – superbly 2011-05-09 11:40:52

3

爲什麼不能用return替換die()

我的解決方案是讓這個拋出異常,然後用另一種方法捕獲異常。然後你可以單元測試function a(),檢查它是否引發了正確的異常。另一個函數處理die()

3

實際上死在這裏似乎不是一個好的解決方案。 但如果沒有辦法改變這個,你可以在另一個進程中運行該函數。

爲此,您必須編寫一個測試文件,其中運行函數A. 前。

<?php 
include 'fileWithAFunction.php'; 
A(); 
?> 

現在用shell_exec調用這個腳本。

$return = shell_exec('testscript.php'); 

return變量保存了testscript的輸出。

+2

+1用於指出*當*由於無法控制的原因而無法*更改原始代碼時*如何操作。 – 2011-05-10 01:57:30

+0

你也可以做一個'file_get_contents('http://example.com/testscript.php')'。 – dave1010 2011-05-11 10:12:14