Cakephp 3使用mock来测试控制器

时间:2016-03-24 10:03:05

标签: unit-testing cakephp mocking cakephp-3.2

我想使用模拟测试控制器。

在我的控制器中

public function myAction() {
    $email = new MandrillApi(['template_name'=>'myTemplate']);
    $result = $email
        ->subject('My title')
        ->from('no-reply@test.com')
        ->to('dest@test.com')
        ->send();

    if ( isset($result[0]['status']) && $result[0]['status'] === 'sent' )
        return $this->redirect(['action' => 'confirmForgotPassword']);

    $this->Flash->error(__("Error"));
}

在测试中

public function testMyAction() {
        $this->get("users/my-action");
        $this->assertRedirect(['controller' => 'Users', 'action' => 'confirmForgotPassword']);
    }

如何模拟MandrillApi类?谢谢

1 个答案:

答案 0 :(得分:2)

在你的控制器测试中:

public function controllerSpy($event){
    parent::controllerSpy($event);
    if (isset($this->_controller)) {
        $MandrillApi = $this->getMock('App\Pathtotheclass\MandrillApi', array('subject', 'from', 'to', 'send'));
        $this->_controller->MandrillApi = $MandrillApi;
        $result = [
            0 => [
                'status' => 'sent'
            ]
        ];
        $this->_controller->MandrillApi
            ->method('send')
            ->will($this->returnValue($result));
    }
}

一旦控制器设置正确,controllerSpy方法将插入模拟对象。您不必调用controllerSpy方法,在测试中进行$this->get(...调用后,它会在某个时刻自动执行。

显然你必须改变模拟代的App\Pathtotheclass部分以适应你的MandrillApi类的位置。