2010-12-21 18 views
3

依賴會話/ cookie信息的單元測試功能的默認實踐是使用抽象庫。但是如果我想編寫和單元測試這個抽象庫呢? PHP setcookiefunction的文檔說明該cookie將在下一個請求中可用。使用命令行工具進行測試,不存在「請求」這樣的事情。那麼我怎樣才能測試正確的cookie設置?以PHP爲單位測試Cookie

我想測試setcookie函數的所有參數是否由我的抽象庫正確設置。這些參數將根據特定條件和方法調用進行設置。

我能想到的唯一解決方案是用runkit擴展模擬setcookie函數,我不想安裝它。其他想法?

+0

[PHPUnit - 單元測試需要發送頭文件的項目]的可能重複(http://stackoverflow.com/q/190292/) – outis 2012-09-24 20:26:38

+0

所以答案是.. a)使用包裝並忘記單元測試那個,或者b)不要使用它。 太好了。 #frustrated – 2015-02-03 07:41:22

回答

9

我發現了另一個,非常簡單的解決方案:圍繞PHP setcookie功能是這樣的簡單的A類包裝,它不需要進行單元測試:

/** 
* Wrapper around setcookie function for better testability 
*/ 
class Cookiesetter { 
    public function setcookie($name, $value = "", $expire = 0, $path = "", 
    $domain = "", $secure = false, $httponly = false) { 
    return setcookie($name, $value, $expire, $path, $domain, $secure, $httponly); 
    } 
} 

setcookie方法然後可以嘲笑。這有額外的好處,我可以實施其他方法,如expireCookie

+0

+1這正是做事情的方式 - 使用模擬和存根刪除依賴關係,以便您可以單獨進行測試。 – Fenton 2011-08-29 16:32:27

+10

「這麼簡單,它不需要進行單元測試」。哎喲! – mbfisher 2013-09-19 09:06:49

2

您可以直接將值設置到當前$ _COOKIE數組:

<?php 
$_COOKIE['test']='hello'; 
print_r($_COOKIE); 
run_tests(); 

(這部作品在CLI模式也是如此)。請注意$ _REQUEST不會被這個更新。

但是如果你只是試圖操縱Cookie,這樣您可以隨後訪問會話,爲什麼不直接訪問會話:

<?php 
$_SESSION['auth_user']='root'; 
run_tests(); 

但我們在這裏談論的單元測試 - 不集成測試 - 這表明代碼結構不是很好。

+0

當我想測試依賴於$ _COOKIE中的值的行爲時,我可以直接設置$ _COOKIE。但我也想測試其他cookie參數,如到期時間和http-only標誌是否被我的庫正確設置。 – chiborg 2010-12-21 14:07:47

+0

但是,感謝關於單元測試和集成測試的評論 - 應該不需要在單元測試中模擬多個請求。一些用於發送正確數據的測試和一些用於處理接收到的數據的測試在單元測試中是更好的樣式。所以我最初的意圖是模擬請求是不必要的。 – chiborg 2010-12-21 14:10:48

-2

你可以隨時使用硒元素。我認爲phpunit有一個擴展,你可以通過它來控制瀏覽器。