注意:我试图在我的一个测试中存根\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只接受一个字符串作为参数,我将其包括在内。
我正在使用:
答案 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"
总之,只是不在自己的代码中编写静态方法。这将使其他开发人员的测试(如我的)更难以处理必须进入外部库的源代码,以了解为什么我无法通过模拟他们的代码来测试我的代码。