鑑於我有一個FruitSalad
類(待測系統):PHPUnit的已命名的靜態構造函數模擬類
class FruitSalad
{
protected $fruits = [];
public function addFruit(Fruit $fruit)
{
$this->fruits[] = $fruit;
return $this;
}
}
而且我有一個Fruit
類:
class Fruit
{
public static function withName($name)
{
$instance = new MyDependencyClass();
$instance->name = $name;
return $instance;
}
}
一個簡單的例子然而,你可以看到,Fruit
類使用一個名爲靜態構造函數,並在FruitSalad
類類型addFruit()
方法暗示Fruit
作爲其預期的參數。
在編寫addFruit()
的測試時,我需要模擬Fruit
類。
function test_it_can_add_a_fruit_to_its_list_of_fruits()
{
$fruit = $this->getMockBuilder('Fruit')
->disableOriginalConstructor()
->getMock();
$this->fruitSalad->addFruit($fruit);
// Do some assertion.
}
這將創建Fruit
類的簡單模擬,但我想通過withName()
靜態方法來初始化它 - 我不希望暴露的name
屬性的設置。
我如何創建使用靜態構造函數命名一個Fruit
模擬?
的理由輾轉
::staticExpects()
你想嘲笑'withName'?如果它應該啓動'Fruit'對象,則靜態方法是錯誤的選擇,請改用'__construct'。 另外,'withName'在你的例子中不會被調用,所以不應該嘲笑這個類是不夠的,或者你稍後調用該方法? – StoryTeller在我的例子中沒有使用它,因爲我需要一個模擬。我不想明確地使用''Fruit :: withName('Apple');'''模擬需要調用該靜態方法來返回對象。 – Amo
順便說一句,有一個術語爲你的靜態「構造函數」 - _factory method_ –