在 Zend Framework 2 中使用 PHPUnit 模拟服务

Mocking service with PHPUnit in Zend Framework 2

我正在尝试模拟删除操作。 delete 方法在服务内部,所以我想模拟控制器内部请求的服务。

这是删除操作:

public function deleteAction()
{
    try {
        $internId = $this->params()->fromRoute('id', 0);
        $this->getServiceLocator()->get('internService')->removeIntern($internId);
    } catch (Exception $e) {
        $this->flashMessenger()->addErrorMessage($e->getMessage() . '<br>' . $e->getTraceAsString());
    }
    return $this->redirect()->toRoute('intern/list');
}

这是执行的服务操作:

 public function removeIntern($internId)
{
    try {
        $intern = $this->getIntern($internId);
        $this->removeEntity($intern);
        $this->flashMessenger()->addSuccessMessage("Intern has Successfully been Removed");
    } catch (Exception $e) {

    }
}

我想在我的测试中模拟这个方法。

我试过这个:

 public function testDeleteAction()
{
    $this->mockBjy();
    $this->mockZFC();

   $internMock = $this->getMockBuilder('Intern\Service\internService')
                        ->disableOriginalConstructor()
                        ->getMock();

$internMock->expects($this->any())
                ->method('removeIntern')
                ->will($this->returnValue(null));

$serviceManager = $this->getApplicationServiceLocator();
$serviceManager->setAllowOverride(true);
$serviceManager->setService('Intern\Service\internService', $internMock);

    $this->dispatch('/intern/delete/86');
    $this->assertModuleName('intern');
    $this->assertControllerName('intern\controller\intern');
    $this->assertControllerClass('InternController');
    $this->assertActionName('delete');
    $this->assertMatchedRouteName('intern/delete');
}

当 运行 PHPUnit 命令时,我在控制台中收到错误:

EntityManager#Remove() expects parameter 1 to be an entity object, NULL given.

任何帮助将不胜感激,提前致谢。

您似乎没有在服务管理器中正确设置模拟。您将在操作中使用 internService 获得服务。在你的测试中,你将你的模拟放在 Intern\Service\internService.

所以发生的事情是您使用的是真实服务而不是您的模拟服务。将您的 setService 调用更改为:

$serviceManager->setService('internService', $internMock);