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