存在一些课程:
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]);
});
}
也许存在简单方法?
答案 0 :(得分: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);
}
}