Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing Cakephp模拟电子邮件实用程序_Unit Testing_Email_Cakephp - Fatal编程技术网

Unit testing Cakephp模拟电子邮件实用程序

Unit testing Cakephp模拟电子邮件实用程序,unit-testing,email,cakephp,Unit Testing,Email,Cakephp,我在用cakephp测试我的用户控制器时遇到了点麻烦, 我有一个动作,向某个电子邮件地址发送电子邮件。 电子邮件实用程序工作正常,没有任何问题 我想模拟电子邮件实用程序,以便在使用testAction测试操作时, 不会发送电子邮件。 我已经搜索了stackoverflow的所有地方,并尝试了很多解决方案,当前代码如下: 用户控制器: /** * Get Email Utility, use method so that unit testing is possible * @re

我在用cakephp测试我的用户控制器时遇到了点麻烦, 我有一个动作,向某个电子邮件地址发送电子邮件。 电子邮件实用程序工作正常,没有任何问题

我想模拟电子邮件实用程序,以便在使用testAction测试操作时, 不会发送电子邮件。 我已经搜索了stackoverflow的所有地方,并尝试了很多解决方案,当前代码如下:

用户控制器:

    /**
 *  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'));
}
我做错了什么?电子邮件实用程序仍然将电子邮件发送到我的地址,即使我嘲笑了它


提前谢谢

我看不出有什么问题,对我来说很好。也许你应该展示所有相关的代码,而不仅仅是一个片段。ps,请始终提及您的确切CakePHP版本!您好,谢谢您的回答,我在代码中插入了完整的方法。注:蛋糕版为2.4.2该问题相关,回答良好: