Cakephp模拟电子邮件实用程序

时间:2013-11-21 09:31:27

标签: unit-testing email cakephp

我有点卡住试图在cakephp中测试我的用户控制器, 我有一个动作,它发送电子邮件到某个电子邮件地址。 电子邮件工具没有问题。

我想模拟电子邮件实用程序,以便在测试操作时(使用“testAction”), 不会发送任何电子邮件。 我已经搜遍了遍历stackoverflow并尝试了很多解决方案,目前的代码如下:

UsersController:

    /**
 *  Get Email Utility, use method so that unit testing is possible
 *  @return object
 */
public function _getEmailer()
{
    return new CakeEmail();
}


public function lostPassword()
{
    if($this->request->is('post'))
    {
        $email = $this->request->data['User']['email'];

        $this->User->recursive = -1;
        $user = $this->User->find('first', array('conditions' => array('email' => $email)));

        if(!$user)
        {
            $this->Session->setFlash('Error: user not found');
            return $this->render();
        }

        $recoverTrials = $this->User->Recover->find('count', array('conditions' => array('email' => $email)));
        if($recoverTrials > 3)
        {
            $this->Session->setFlash(__('message.recover-too-many'));
            return $this->redirect('/');
        }

        // Generate random key to reset password
        $key = md5(microtime().rand());

        $data = array('user_id' => $user['User']['id'],
                      'key' => $key,
                      'active' => 1,
                      'created' => date('Y-m-d H:i:s'));

        if(!$this->User->Recover->save($data))
        {
            $this->Session->setFlash('Error while sending the recovery-mail');
            return $this->redirect('/');
        }

        $this->Email = $this->_getEmailer();
        $this->Email->emailFormat('html');
        $this->Email->to($email);
        $this->Email->subject('Password recover');
        $this->Email->replyTo('noreply@domain.com');
        $this->Email->from(array('noreply@domain.com' => 'Sender ID'));
        $this->Email->template('recover');
        $this->Email->viewVars(array('key' => $key));   // Set variables for template

        try
        {
            $this->Email->send();
        }
        catch(Exception $e)
        {
            $this->Session->setFlash('Error while sending the recovery-mail');
            return $this->render();
        }

        $this->Session->setFlash('The recovery mail with instructions to reset your password has been sent. Please note that the link will only remain active for 2 hours.');
        return $this->redirect('/');
    }
}

我的测试类看起来像(摘录):

public function testPostLostPassword()
{
    $this->Controller = $this->generate('Users', array(
        'methods' => array(
            '_getEmailer'
        ),
        'components' => array('Security')
    ));

    $emailer = $this->getMock('CakeEmail', array(
        'to',
        'emailFormat',
        'subject',
        'replyTo',
        'from',
        'template',
        'viewVars',
        'send'
    ));

    $emailer->expects($this->any())
            ->method('send')
            ->will($this->returnValue(true));

    $this->Controller->expects($this->any())
                    ->method('_getEmailer')
                    ->will($this->returnValue($emailer));

    Correct email
    $data = array('User' => array('email' => 'me@domain.com'));
    $result = $this->testAction('/lostPassword', array('method' => 'post',
                                                             'data' => $data,
                                                             'return' => 'contents'));
}

我做错了什么?电子邮件实用程序仍会将电子邮件发送到我的地址,即使我嘲笑它......

提前致谢!

0 个答案:

没有答案