如何在PHPunit中实现测试双打(站在模拟中),我缺少什么琐事?

时间:2012-11-15 16:20:10

标签: php mocking phpunit

我可能在这里遗漏了一些非常简单的东西,但是我无法让phpunit使用替代Mocked类。

下面是一个示例,其中Foo是我正在测试的类,而Bar是我想要模拟的类。

我希望下面的示例可以通过,因为我已经模拟了Bar,删除了Bar::heavy_lifting以返回“not bar”,然后调用该低位Foo::do_stuff()。 然而它失败了,这个例子仍然返回“bar”,似乎完全无视我的存根。

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

1 个答案:

答案 0 :(得分:2)

您的代码无法按预期工作。 Stub不是要替换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();
    }

}

你可以将模拟的Bar传递给Foo类。