0

存在一些类:

class A{
  protected $options;
  public function setDefaults($defaults){
      $this->options=$defaults;
  }
  public function getOptions(){
     return  $this->options;
  }
}

和其他类:

class B{
public function setDefaultOptions(A $options){
   $options->setDefaults('foo'=>'bar')
}

}

用途:

$a=new A();
$b=new B();
$b->setDefaultsOptions(a);

如何检查 B 的规范是否设置了 $a->options['foo']?


现在我将其实现为:

  public function getMatchers(){
    return array('haveResolverKey'=>
    function($subject, $key){
        $resolver=new A();
        $subject->setDefaultOptions($resolver);
        $ret=$resolver->getOptions();

        return isset($ret[$key]);
    });
  }

也许存在简单的方法?

4

1 回答 1

1

如何检查 B 的规范是否设置了 $a->options['foo']?

你不应该。验证行为而不是状态

换句话说,您应该验证方法的输出并表达对合作者的期望,而不是验证类的内部状态。

一旦重构,内部结构可能会发生变化,行为应该保持不变。

据我了解您的示例,它可以描述为:

class BSpec extends ObjectBehavior
{
    function it_sets_defaults_on_a(A $a)
    {
        $a->setDefaults(array('foo' => 'bar'))->shouldBeCalled();

        $this->setDefaultOptions($a);
    }
}
于 2013-10-08T23:24:19.563 回答