单元测试时类型错误异常(zend-test,PHPUnit)

Type Error exception while unit testing (zend-test, PHPUnit)

我正在尝试在 Zend FrameWork 中测试一个简单的控制器操作,但我不是 100% 确定为什么我的模拟不起作用。

原操作:

 public function overviewAction()
    {
        $page = $this->params()->fromQuery('page', 1);
        $count = 10;

        $user = $this->authenticationService->getIdentity();

        return new ViewModel([
            'paginator' => $this->agentService->getAgentsOwnedByUser($page, $count, $user),
        ]);
    }

我对这个动作的测试

    /**
     * Set Rbac Role and route
     */
    $url = "cp/agent";
    $this->setRbacGuards(['admin']);
    //Nb Rbac class code is here

    /**
     * Objects required in this test
     */
    $user = $this->createMock(User::class);
    $paginator = $this->createMock(Paginator::class);

    /**
     * Mock classes and their methods to be called
     */
    $authentication = $this->createMock(AuthenticationService::class);
    $authentication
        ->expects($this->once())
        ->method('getIdentity')
        ->will($this->returnValue($this->registerMockObject($user)));


    $agentService = $this->createMock(AgentService::class);
    $agentService
        ->expects($this->once())
        ->method('getAgentsOwnedByUser')
        ->will($this->returnValue($this->registerMockObject($paginator)));

    $this->dispatch('/'.$url);
    $this->assertResponseStatusCode(200);

错误信息

 There was 1 failure:

    1) ControlPanelTest\Controller\AgentControllerTest::testAgentOverviewActionCanBeAccessed
    Failed asserting response code "200", actual status code is "500"

    Exceptions raised:
    Exception 'TypeError' with message 'Argument 3 passed to 

    Admin\Service\AgentService::getAgentsOwnedByUser() must be an instance of Domain\User\User, null given
.

为了完整起见,Rbac Class

public function rbacGuards($roles)
    {
        /**
         * Deal with Rbac Guards
         */
        $roleService = $this->getApplicationServiceLocator()->get(RoleService::class);
        $identityProvider = $this->prophesize(IdentityProviderInterface::class);
        $identity = $this->prophesize(IdentityInterface::class);
        // Here you use the setter to inject your mocked identity provider
        $roleService->setIdentityProvider($identityProvider->reveal());
        $identityProvider->getIdentity()->shouldBeCalled()->willReturn($identity->reveal());
        $identity->getRoles()->shouldBeCalled()->willReturn($roles);
    }

预后

似乎没有调用模拟...

在您的示例中,您创建了 $authentication 模拟,但没有将其注册为您正在测试的 class 的 属性。 因此,当 overviewAction 使用 $this->authenticationService->getIdentity(); 时,它 而不是 使用您创建的模拟。