我有以下情況。比方說,我有兩個類:單元測試交換父類
class Session {
public function start() {
return session_start();
}
// methods for all the other session functions of PHP
}
並延伸Session
class TrustedSession extends Session {
public function start() {
if(parent::start() === false)
return false;
$requestRemoteAddress = isset($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:null;
$requestUserAgent = isset($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT']:null;
$trustedRemoteAddress = $this->get('TRUSTED_REMOTE_ADDR');
$prevUserAgent = $this->get('PREV_USERAGENT');
if($trustedRemoteAddress !== $requestRemoteAddress || $prevUserAgent !== $requestUserAgent)
$this->regenerateID(true);
return true;
}
}
所以沒有我想測試我的TrustedSession
類的子類。但我必須使用Session
的模擬,因爲according to this question here我不能使用PHP的真實會話功能,因爲它們導致PHPUnit出現Output already started
錯誤。
現在的問題:如何模擬Session
類。我的意思是我可以創建一個SessionInterface
,它定義了我必須實現的方法Session
及其模型。但是,我怎樣才能用模型擴展我的TrustedSession
類呢?
我的想法是在運行時交換父類,但我認爲這是不可能的(至少在PHP中)。這是一個設計問題,我正在考慮上面介紹的接口,但這並不能幫助我擺脫這種情況。有沒有一個「乾淨」,很好的解決方案?
爲什麼你不直接模擬TrustedSession ?.你可以模擬從父類繼承的方法。 – gontrollez
@gontrollez如果測試'TrustedSession',如果它是模擬的,我該如何測試?可能我無法按照你的想法。如果你能在答案中告訴我你在想什麼,這將是很好的.-) – TiMESPLiNTER