PHPUnit用stub覆盖实际方法

时间:2015-02-09 20:55:30

标签: php unit-testing mocking phpunit stub

我刚刚开始使用PHPUnit,我想知道是否可以使用存根覆盖/替换方法。我对Sinon有一些经验,而对于Sinon,这是可能的(http://sinonjs.org/docs/#stubs

我想要这样的事情:

<?php

class Foo {

  public $bar;

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

  public function getBarString() {
    return $this->bar->getString();
  }

}

class Bar {

  public function getString() {
    return 'Some string';
  }

}



class FooTest extends PHPUnit_Framework_TestCase {

  public function testStringThing() {
    $foo = new Foo();

    $mock = $this->getMockBuilder( 'Bar' )
      ->setMethods(array( 'getString' ))
      ->getMock();

    $mock->method('getString')
      ->willReturn('Some other string');

    $this->assertEquals( 'Some other string', $foo->getBarString() );
  }

}

?>

1 个答案:

答案 0 :(得分:2)

这不起作用,你将无法模拟Foo实例中的Bar实例。 Bar在Foo的构造函数中实例化。

更好的方法是将Foo的依赖注入Bar,i。 E:

<?php

class Foo {

  public $bar;

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

  public function getBarString() {
    return $this->bar->getString();
  }
}

class Bar {

  public function getString() {
    return 'Some string';
  }

}

class FooTest extends PHPUnit_Framework_TestCase {

  public function testStringThing() {

    $mock = $this->getMockBuilder( 'Bar' )
      ->setMethods(array( 'getString' ))
      ->getMock();

    $mock->method('getString')
      ->willReturn('Some other string');

    $foo = new Foo($mock); // Inject the mocked Bar instance to Foo

    $this->assertEquals( 'Some other string', $foo->getBarString() );
  }
}

请参阅http://code.tutsplus.com/tutorials/dependency-injection-in-php--net-28146获取DI教程。