2010-03-09 27 views
7

有什麼方法可以在模擬對象內設置類級變量?如何在模擬對象中設置變量

我有模擬對象設置與此類似:

$stub = $this->getMock('SokmeClass', array('method')); 
$stub->expects($this->once()) 
     ->method('method') 
     ->with($this->equalTo($arg1)); 

贏得真正的類存在需要進行設置才能正常工作的變量。如何在模擬對象中設置該變量?

回答

2

存根的思想是用一個測試double替換一個依賴,提供相同的方法接口(可選地)返回配置的返回值。通過這種方式,SUT可以像使用依賴關係一樣使用雙精度。如果從存根需要一個特定的返回值,你只要告訴它應該返回什麼,例如:

// Create a stub for the SomeClass class. 
$stub = $this->getMock('SomeClass'); 

// Configure the stub. 
$stub->expects($this->any()) 
    ->method('doSomething') 
    ->will($this->returnArgument(0)); 

$stub->doSomething('foo'); // returns foo 

http://www.phpunit.de/manual/current/en/test-doubles.html

+0

我想我應該讓這個例子更容易理解。該類與此類似: class SomeClass { $ someVar; 公共功能setSomeVar(顏色$藍色){ $ someVar =「Blue」; } public function getSomeVar(){ return $ someVar; }} 在Mock對象,我不能設置變量,所以當我使用它的其他地方,我的對象得到一個空...... – Enrique 2010-03-10 21:13:17

+0

@Enrique嗯,無論是廣告還是我沒有得到它:)你可以告訴Mock創建它時應該返回的內容。無需在其中設置任何內容。如果你想讓它返回藍色,告訴它返回藍色。 – Gordon 2010-03-10 21:53:55

+0

@戈登還行。也許我錯過了一些東西。讓我試着解釋一下我所處的情況,而不會溢出太多的豆子。我有一個將數據發送到表的方法'隊列'。爲'隊列'運行一個類級變量$ transport必須被設置,否則它會拋出一個錯誤(不知道該去哪裏)。我需要$運輸設置爲null以外的東西,二傳手犯規返回的參數(沒有消氣的「排隊」方法來調用。舊的遺留代碼...) – Enrique 2010-03-11 15:30:54

5

不知道爲什麼這個工作,但它似乎爲我。如果您將__get魔術方法作爲重寫方法之一,例如

$mock = $this->getMock('Mail', array('__get')); 

你可以,那麼你可以做成功

$mock->transport = 'smtp'; 
11

這裏是什麼對我的作品:

$stub = $this->getMock('SomeClass'); 
$stub->myvar = "Value"; 
+1

我認爲這是最簡單回答被問到的問題的答案。海報問的是實例變量而不是方法。其他幾個答案似乎集中在方法上。 @ Nat的答案和這個一樣,除了你不需要重寫__get方法(至少不是最新版本) – 2015-01-07 16:14:57

+0

很好的完成,PhpUnit。 – 2015-03-25 18:23:14

0

我要建議以下考慮您有相關的評論的討論@Gordon。

我認爲你需要意識到的是你真的在測試getters/setters而不是你正在實現的實際邏輯。

你應該把你的代碼分解成你可以測試的更小的塊。

然後繼續從較小的方法測試您期望的數據。 (您可以測試受保護的方法。)

在實際代碼中,您可以調用這些較小的塊(方法)並在另一個公共函數中填充所需的對象(不應該測試它,因爲設置變量並將其獲取到對象應該很簡單,甚至不值得測試。)

相關問題