1

私はおそらくここで本当に些細なことを見逃していますが、phpunitに代用のMockedクラスを使用させることはできません。

以下は、Foo私がテストしBarているクラスとモックアウトしたいクラスの例です。

私はモックをしたので、以下の例が通過することを期待しますBar。スタブアウトBar::heavy_liftingして「バーではない」を返し、そのトラフを呼び出しますFoo::do_stuff()。それでも失敗し、例はまだ「バー」を返し、私のスタブを完全に無視しているようです。

class Foo {
  public function do_stuff() {
    $b = new Bar();
    return $b->heavy_lifting();
  }
}

class Bar {
  public function heavy_lifting() {
    return "bar";
  }
}

class FooTest extends PHPUnit_Framework_TestCase {
  public function testBar() {
    $fake     = "not bar";
    $stand_in = $this->getMock("Bar");
    $stand_in->expects($this->any())
             ->method("heavy_lifting")
             ->will($this->returnValue($fake));

    $foo = new Foo();
    $this->assertEquals($foo->do_stuff(), $fake);
  }
}
4

1 に答える 1

2

コードが期待どおりに機能しません。スタブはBarクラスを置き換えることではなく、Barが期待される場所に渡すことができるオブジェクトを作成することです。Fooクラスを次のようにリファクタリングする必要があります。

class Foo {

    /* inject your dependency to Foo, it can be injected in many ways,
       using constructor, setter, or DI Container */

    public function __construct(Bar $bar) {
        $this->bar = $bar;
    }

    public  function do_stuff() {
        $this->bar->heavy_lifting();
    }

}

あなたがモックバーをクラスFooに渡すことができるより。

于 2012-11-15T22:11:18.397 に答える