PHPunit 方法模拟不起作用
PHPunit method mocking does not work
我不明白为什么我的方法 mocking 不起作用,因为方法 运行 确实存在,并且不想 return 具有 mocked 值。 (交响乐)
$this->mockedObject = $this
->getMockBuilder('Object')
//->setConstructorArgs(array('em' => $this->entityManager, 'router' => $this->mockedRouter))
->disableOriginalConstructor()
->setMethods(array('method1', 'method2'))
->getMock();
$this->mockedObject
->expects($this->once())
->method('method2')
->willReturn(9);
所以如你所见,我嘲笑了 method2,但 method2 从来没有 return 具有 9 值,因为它是 运行:
Error: Call to a member function createQueryBuilder() on null
这里是原方法2:
private function method2($repository) {
$qb = $this->em->createQueryBuilder();
$qb->select('count(e.id)');
$qb->from($repository, 'e');
return $qb->getQuery()->getSingleScalarResult();
}
这就是问题所在,因为 mockedObject 使用 createQueryBuilder
方法
调用 method2()
如何实现 method2 被模拟并且 returns 具有 9 个值?
发生这种情况是因为您不能像这样模拟私有方法。要回答您的问题,您仍然可以通过更改方法的可见性来回答:
$method = new ReflectionMethod('Object', 'method2');
$method->setAccessible(true);
尽管我不建议测试私有方法。您应该尝试模拟此 class 对 return 的依赖关系。模拟私有方法通常意味着 class.
的逻辑有问题
我也不建议在原始 class 中更改方法的可见性,因为您永远不应该为了让测试满意而更改代码。如果一个方法在其他方面是私有的,则没有单一的理由将其更改为受保护或 public.
我不明白为什么我的方法 mocking 不起作用,因为方法 运行 确实存在,并且不想 return 具有 mocked 值。 (交响乐)
$this->mockedObject = $this
->getMockBuilder('Object')
//->setConstructorArgs(array('em' => $this->entityManager, 'router' => $this->mockedRouter))
->disableOriginalConstructor()
->setMethods(array('method1', 'method2'))
->getMock();
$this->mockedObject
->expects($this->once())
->method('method2')
->willReturn(9);
所以如你所见,我嘲笑了 method2,但 method2 从来没有 return 具有 9 值,因为它是 运行:
Error: Call to a member function createQueryBuilder() on null
这里是原方法2:
private function method2($repository) {
$qb = $this->em->createQueryBuilder();
$qb->select('count(e.id)');
$qb->from($repository, 'e');
return $qb->getQuery()->getSingleScalarResult();
}
这就是问题所在,因为 mockedObject 使用 createQueryBuilder
方法
如何实现 method2 被模拟并且 returns 具有 9 个值?
发生这种情况是因为您不能像这样模拟私有方法。要回答您的问题,您仍然可以通过更改方法的可见性来回答:
$method = new ReflectionMethod('Object', 'method2');
$method->setAccessible(true);
尽管我不建议测试私有方法。您应该尝试模拟此 class 对 return 的依赖关系。模拟私有方法通常意味着 class.
的逻辑有问题我也不建议在原始 class 中更改方法的可见性,因为您永远不应该为了让测试满意而更改代码。如果一个方法在其他方面是私有的,则没有单一的理由将其更改为受保护或 public.