【发布时间】:2016-01-28 03:28:19
【问题描述】:
假设我有一个FruitSalad 类(被测系统):
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 创建模拟?
【问题讨论】:
-
你想模拟
withName吗?如果它应该启动Fruit对象,静态方法是错误的选择,请改用__construct。此外,withName在您的示例中无论如何都没有被调用,所以不应该模拟该类就足够了,或者您稍后再调用该方法? -
我的示例中没有使用它,因为我需要一个模拟。我不想显式使用
Fruit::withName('Apple');模拟需要调用该静态方法来返回对象。 -
顺便说一句,您的静态“构造函数”有一个术语 - 工厂方法
标签: php unit-testing mocking dependencies phpunit