单元测试(zend-test,PHPUnit)时键入Error异常

时间:2019-01-05 09:24:21

标签: zend-framework2 phpunit zend-test

我正在尝试在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类

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);
    }

预后

似乎没有嘲笑...

1 个答案:

答案 0 :(得分:0)

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