PHPUnit存根返回意外的NULL值

时间:2014-01-14 15:06:33

标签: php phpunit

  

注意:我试图在我的一个测试中存根\HTML5对象。

模拟loadHTML()方法并设置返回值时,该值将返回NULL。

/** Set up my expectations **/
$stub = $this->getMock("\HTML5");
$stub->expects($this->once())
     ->method("loadHTML")
     ->with("some data")
     ->will($this->returnValue("Some Value"));

以上设置了调用\HTML5::loadHTML("some data")将返回字符串Some Value的期望。我们称之为这种方法。

var_dump($stub->loadHTML("some data")); // NULL

调用loadHTML()会将NULL显示为返回值。

为什么我的预期价值没有被退回?这是一个错误吗?我正在使用的库有问题吗?

  • \HTML5对象没有特定的constructor实现,因此我无需在disableOriginalConstructor()对象上调用$stub来绕过此对象。< / p>

  • loadHTML() method只接受一个字符串作为参数,我将其包括在内。

我正在使用:

  • PHP 5.4.9
  • PHPUnit 3.7.28
  • 我的大脑

1 个答案:

答案 0 :(得分:2)

loadHTML()方法是静态方法。在PHPUnit中,您没有使用expects()设置模拟静态方法期望值;您必须改为使用staticExpects()

这不是直接相关的原因是因为PHP允许调用静态方法,因为如果已经实例化了封装这些方法的对象,那么就会执行普通方法。

我已经创建了\HTML5对象,因此可以使用->调用静态方法,而不是在没有对象实例化的情况下使用的通常::

2010年,Sebastian Bermann wrote a post描述了 PHPUnit 5.3 + 中提供的新staticExpects()方法。

以上是使用静态方法重写的代码:

$stub = $this->getMock("\HTML5");
$stub->staticExpects($this->once())
     ->method("loadHTML")
     ->with("some data")
     ->will($this->returnValue("Some Value"));

var_dump($stub->loadHTML("some data")); // "Some Value"

总之,只是不在自己的代码中编写静态方法。这将使其他开发人员的测试(如我的)更难以处理必须进入外部库的源代码,以了解为什么我无法通过模拟他们的代码来测试我的代码。