我的课程类似于以下内容:
class Foo {
/**
* @var array|Bar
*/
protected $source;
public function __construct($source = []) {
if (class_exists(Bar::class)) {
$source = new Bar($source);
}
$this->source = $source;
}
public function getSource() {
return $this->source;
}
// ...
}
Bar
来自一个单独的PHP包,suggest
composer.json
部分列出的可选依赖项。
我想在phpspec中为getSource()
function it_provides_array_source_by_default() {
$this->getSource()->shouldBeArray();
}
function it_provides_bar_instance_when_available() {
$this->getSource()->shouldReturnAnInstanceOf(Bar::class);
}
如果包的shouldBeArray()
包含包含require-dev
的相关性,我无法测试Bar
。
我无法模仿Bar
:
function it_provides_bar_instance_when_available(Bar $bar) {
$this->getSource()->shouldReturnAnInstanceOf(Bar::class);
}
因为我收到了phpspec错误:
[PhpSpec \异常\定位器\ ResourceCreationException] 找不到类
Bar
的适当套件范围。
测试返回值的最佳实践方法是什么样的可选类?
答案 0 :(得分:1)
将选择$source
类型的逻辑移动到外部工厂函数中。
class Foo {
protected $source;
public function __construct($source = []) {
$this->source = $source;
}
}
class FooFactory {
public get() {
$source = [];
if (class_exists(Bar::class)) {
$source = new Bar($source);
}
return new Foo($source);
}
}
这允许您通过将所有内容移动到依赖注入模型来明确地测试{em}和两种方式Foo
。