测试项目中可选项的使用

时间:2015-05-26 15:12:20

标签: php phpspec

我的课程类似于以下内容:

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的适当套件范围。

测试返回值的最佳实践方法是什么样的可选类?

1 个答案:

答案 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