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

方法预期调用1次,实际调用0次[PHPUnit],php,symfony,phpunit,Php,Symfony,Phpunit,我一直在测试、添加和删除行,以查看问题所在。我已经设法删减了很多行,基本上我的测试是这样的(当然要看看有什么错误,我知道这不是正确的测试): 但还是不行!我从标题中得到一个错误: 方法名称等于的预期失败 调用1次时。方法是预期的 被调用1次,实际调用0次 我错过了什么 您可以指定要模拟的方法(而不是完整的类),这样类的行为就可以只模拟要测试的方法,如下所示: public function testFindOne() { $invoice = new Invoice(); $in

我一直在测试、添加和删除行,以查看问题所在。我已经设法删减了很多行,基本上我的测试是这样的(当然要看看有什么错误,我知道这不是正确的测试):

但还是不行!我从标题中得到一个错误:

方法名称等于的预期失败 调用1次时。方法是预期的 被调用1次,实际调用0次


我错过了什么

您可以指定要模拟的方法(而不是完整的类),这样类的行为就可以只模拟要测试的方法,如下所示:

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();
}
因此,断言按预期工作


希望这对您有所帮助

您的断言失败了,因为EntityRepository实际上没有一个名为
findOneByNextNote
的实现方法,因此它也从未被调用过

但是,实现了magic
\uu调用
方法(并且调用
findOneByNextNote
将通过PHP引擎的方法重载委托给该方法),因此您可以断言调用该方法是为了修复断言


一个可能更好的解决方案是使用该特定方法实际编写一个具体的InvoiceRepository类(我甚至建议使用一个接口),并模拟该类或接口。

有时在“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.
    $mock = $this
        ->getMockBuilder(YourClass::class)
        ->setMethods(['emit'])
        ->getMock();

    $mock->expects($this->once())->method('emit');
    $mock->emit();
示例良好

    $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.
    $mock = $this
        ->getMockBuilder(YourClass::class)
        ->setMethods(['emit'])
        ->getMock();

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

我们不知道您缺少什么,但我们缺少经过测试的代码;)我不知道你的模拟框架是如何工作的,但是对于其他框架,你必须“启动”你的模拟。像是
EasyMock.replay(mockObject)
@lukelazarovic,但我的测试现在看起来就是这样!我相信问题是没有真正调用名为“findOneByNextNote”的方法,因为这是通过方法重载委托给EntityRepository的u调用方法的。为什么有人在没有任何解释的情况下投了反对票?是问题中描述的问题的一个有效的、经过测试的解决方案。我不认为这个解决方案是理想的,您最好使用模拟stdClass,而不是repository类。