有什麼方法可以在模擬對象內設置類級變量?如何在模擬對象中設置變量
我有模擬對象設置與此類似:
$stub = $this->getMock('SokmeClass', array('method'));
$stub->expects($this->once())
->method('method')
->with($this->equalTo($arg1));
贏得真正的類存在需要進行設置才能正常工作的變量。如何在模擬對象中設置該變量?
有什麼方法可以在模擬對象內設置類級變量?如何在模擬對象中設置變量
我有模擬對象設置與此類似:
$stub = $this->getMock('SokmeClass', array('method'));
$stub->expects($this->once())
->method('method')
->with($this->equalTo($arg1));
贏得真正的類存在需要進行設置才能正常工作的變量。如何在模擬對象中設置該變量?
存根的思想是用一個測試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
不知道爲什麼這個工作,但它似乎爲我。如果您將__get
魔術方法作爲重寫方法之一,例如
$mock = $this->getMock('Mail', array('__get'));
你可以,那麼你可以做成功
$mock->transport = 'smtp';
這裏是什麼對我的作品:
$stub = $this->getMock('SomeClass');
$stub->myvar = "Value";
我認爲這是最簡單回答被問到的問題的答案。海報問的是實例變量而不是方法。其他幾個答案似乎集中在方法上。 @ Nat的答案和這個一樣,除了你不需要重寫__get方法(至少不是最新版本) – 2015-01-07 16:14:57
很好的完成,PhpUnit。 – 2015-03-25 18:23:14
我要建議以下考慮您有相關的評論的討論@Gordon。
我認爲你需要意識到的是你真的在測試getters/setters而不是你正在實現的實際邏輯。
你應該把你的代碼分解成你可以測試的更小的塊。
然後繼續從較小的方法測試您期望的數據。 (您可以測試受保護的方法。)
在實際代碼中,您可以調用這些較小的塊(方法)並在另一個公共函數中填充所需的對象(不應該測試它,因爲設置變量並將其獲取到對象應該很簡單,甚至不值得測試。)
我想我應該讓這個例子更容易理解。該類與此類似: class SomeClass { $ someVar; 公共功能setSomeVar(顏色$藍色){ $ someVar =「Blue」; } public function getSomeVar(){ return $ someVar; }} 在Mock對象,我不能設置變量,所以當我使用它的其他地方,我的對象得到一個空...... – Enrique 2010-03-10 21:13:17
@Enrique嗯,無論是廣告還是我沒有得到它:)你可以告訴Mock創建它時應該返回的內容。無需在其中設置任何內容。如果你想讓它返回藍色,告訴它返回藍色。 – Gordon 2010-03-10 21:53:55
@戈登還行。也許我錯過了一些東西。讓我試着解釋一下我所處的情況,而不會溢出太多的豆子。我有一個將數據發送到表的方法'隊列'。爲'隊列'運行一個類級變量$ transport必須被設置,否則它會拋出一個錯誤(不知道該去哪裏)。我需要$運輸設置爲null以外的東西,二傳手犯規返回的參數(沒有消氣的「排隊」方法來調用。舊的遺留代碼...) – Enrique 2010-03-11 15:30:54