PHPUnit调用未定义的方法`Mock_x _ :: method()`

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.

怎么会?我该如何解决?

eju*_*jav 6

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版本,因为它似乎有点难以找到这个旧版本的文档.