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);

$a->options['foo'] が設定されている B の仕様を確認するにはどうすればよいですか?


今、私はそれを次のように実装します:

  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

$a->options['foo'] が設定されている B の仕様を確認するにはどうすればよいですか?

すべきではありません。状態ではなく動作を確認します。

つまり、クラスの内部状態を検証するのではなく、メソッドの出力を検証し、共同作業者に対する期待を表明する必要があります。

リファクタリングすると内部が変わる可能性がありますが、動作は同じままである必要があります。

私があなたの例を理解している限り、それは次のように説明できます:

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 に答える