用phpunit抽象控制器中的模拟方法

时间:2015-05-11 11:56:20

标签: php unit-testing zend-framework2 phpunit

我想在Zend Framework 2中使用PHPunit模拟一个方法。

该方法是' AbstractController'由我正在测试的类扩展的类。

我用来测试的代码:

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

    $zfcUser = $this->getMockBuilder('Common\Controller\AbstractController')->getMock();
    $zfcUser ->method('getUserId')
            ->will($this->returnValue('2'));
      $this->assertEquals(2, $zfcUser->getUserId());

    $this->dispatch('/leaverequest/add','POST', array('user' => '2','reasonforleave' => 'PHPunit','leaveRequestDates'=> '05/06/2015 - 05/15/2015'));
    $this->assertModuleName('Employment');
    $this->assertControllerName('employment\controller\leaverequest');
    $this->assertControllerClass('LeaveRequestController');
    $this->assertActionName('add');
    $this->assertMatchedRouteName('leaverequest/add');
}

抽象控制器中的代码:

protected function getUserId()
{
    return $this->zfcUserAuthentication()
                    ->getIdentity()
                    ->getId();
}

正在测试的控制器中需要此方法的代码,请查看if语句第二行调用的方法中的第二个参数($ this-> getUserId())。

public function addAction()
{
    if ($this->getRequest()->isPost()) {
        $this->getServiceLocator()->get('leaveRequestService')->addLeaveRequest($this->getRequest()->getPost()->toArray(), $this->getUserId());
        $returnValue = $this->redirect()->toRoute('leaverequest/list');
    } else {
        $users = $this->getServiceLocator()->get('userService')->findAllUsers();
        $returnValue = new ViewModel(array('users' => $users));
    }
    return $returnValue;
}

我需要模拟此方法的结果,但是无法使用当前代码执行此操作。我收到的消息如下:在.....

中的非对象上调用成员函数getId()

提前谢谢你:)

所以我意识到模拟抽象是一种糟糕的方法,而应该模拟调度方法调用的请求服务。我现在尝试模拟离开请求addLeaveRequestService,但第二个参数$ this-> getUserId仍然被触发,导致单元测试在抽象控制器中的getId方法失败并提供错误消息&#34 ; "在非对象上调用成员函数"

0 个答案:

没有答案