xto*_*ofl 6 php phpunit mocking undefined
我正在尝试创建我的第一个phpunit测试,发现自己需要在IMailer接口上存根方法.
interface IMailer
{
public function send($to, $from, $cc, $subject, $body);
public function sent();
}
$mailer = $this->getMockBuilder(
'IMailer',
array('send', 'sent'))->getMock();
$mailer->method('send')->willRreturn(0);
Run Code Online (Sandbox Code Playgroud)
但是,我一直在努力
PHP Fatal error:
Call to undefined method Mock_Mailer_13fc0a04::method()
in ...Test.php on line 16
Run Code Online (Sandbox Code Playgroud)
一个var_dump($mailer);结果
class Mock_IMailer_4c3e02a7#215 (1) {
private $__phpunit_invocationMocker =>
NULL
}
Run Code Online (Sandbox Code Playgroud)
使用the expect($this->any())给出了一个dito错误 - 似乎被模拟的对象没有任何模拟功能......
我在ubuntu盒子上运行phpunit 3.7.28和php 5.5.9.
怎么会?我该如何解决?
getMockBuilder函数仅接受className作为参数.初始化模拟对象方法的正确方法是使用setMethods函数(参见phpunit docs)
$mailer = $this->getMockBuilder('IMailer')
->setMethods(array('send', 'sent'))
->getMock();
Run Code Online (Sandbox Code Playgroud)
另外,当您使用模拟对象时,您可能还希望有一些预期定义:
$mailer->expects($this->any())
->method('send')
->willReturn(0);
Run Code Online (Sandbox Code Playgroud)
编辑
以上适用于较新的phpunit版本.对于phpunit 3.7.28,模拟对象的使用有点不同(即期望似乎是强制性的并且willReturn尚不可用).对于3.7.28版本,您应该将第二部分修改为:
$mailer->expects($this->any())
->method('send')
->will($this->returnValue(0));
Run Code Online (Sandbox Code Playgroud)
我建议更新到以后的phpunit版本,因为它似乎有点难以找到这个旧版本的文档.