方法预计被调用 1 次,实际调用 0 次 [PHPUnit]

mmm*_*mmm 5 php phpunit symfony

我一直在测试、添加和删除线路以查看问题出在哪里。我已经设法剪掉了很多行,基本上我的测试看起来像这样(当然要看看出了什么问题,我知道这不是正确的测试):

public function test()
{
     $invoice = new Invoice();
     $invoiceRepository = $this
            ->getMockBuilder('\Doctrine\ORM\EntityRepository')
            ->disableOriginalConstructor()
            ->getMock();
      $invoiceRepository->expects($this->once())
            ->method('findOneByNextNote')
            ->will($this->returnValue($invoice));

      $invoiceRepository->findOneByNextNote();
}
Run Code Online (Sandbox Code Playgroud)

但仍然不起作用!我从标题中收到一个错误:

当调用 1 次时,方法名称的预期失败等于 < string:findOneByNextNote >。方法预计被调用 1 次,实际调用 0 次。

我缺少什么?

Geo*_*vik 8

有时,当您在“expects()”指令之前调用该方法时,会出现这种误解。所以代码看起来很棒但没有工作。

不好的例子:

    $mock = $this
        ->getMockBuilder(YourClass::class)
        ->setMethods(['emit'])
        ->getMock();

    $mock->emit();
    $mock->expects($this->once())->method('emit');

    //Method was expected to be called 1 times, actually called 0 times.
Run Code Online (Sandbox Code Playgroud)

好的例子:

    $mock = $this
        ->getMockBuilder(YourClass::class)
        ->setMethods(['emit'])
        ->getMock();

    $mock->expects($this->once())->method('emit');
    $mock->emit();
Run Code Online (Sandbox Code Playgroud)


Mat*_*teo 4

您可以指定要模拟的方法(而不是整个类),以便模拟该类的行为,因此仅模拟您要测试的方法,如下所示:

public function testFindOne()
{
    $invoice = new Invoice();
    $invoiceRepository = $this
        ->getMockBuilder('\Doctrine\ORM\EntityRepository')
        ->setMethods(array('findOneByNextNote'))
        ->disableOriginalConstructor()
        ->getMock();
    $invoiceRepository->expects($this->once())
        ->method('findOneByNextNote')
        ->will($this->returnValue($invoice));

    $invoiceRepository->findOneByNextNote();
}
Run Code Online (Sandbox Code Playgroud)

所以断言按预期工作

希望这可以帮助