2012-06-19 30 views
0

我開始爲應用程序編寫測試,並且我已經使用包裝器RedirectComponent來處理所有重定向。現在我開始測試我的應用程序了(我對這個測試相當新)我在這裏跟隨這個例子... http://book.cakephp.org/2.0/en/development/testing.html#a-more-complex-example

現在一切正常,除了我不能在$this->headers參數上運行斷言,因爲它始終是空白的。我發現,如果我直接在控制器中使用的控制器重定向重定向方法的一切工作正常,並$this->headers設置爲:

array(
    'Location' => 'http://localhost/inquiries/view/4' 
) 

但是整個應用程序正在使用此RedirectComponent,我想獲得的$this->headers露面當編寫使用這個組件重定向的控制器測試時。

雖然我失去了如何解決這個問題,因爲看起來我正在做的一切都是正確的,它應該工作。

以下是我的代碼。

class InquiriesControllerTestCase extends ControllerTestCase { 


    /** 
    * Test Add Pass 
    * 
    * @return void 
    */ 
    public function testAddPass() { 
     $minimumInsertData = array(
       'Inquiry'=>array(
        'fname'=>'---Minimum Insert---', 
        'lname'=>'---Minimum Insert---', 
        'phone'=>'---Minimum Insert---', 
        'email'=>'[email protected]', 
        'subject'=>'---Minimum Insert---', 
        'inquiry'=>'---Minimum Insert---', 
       ) 
      ); 

     #create mock controller 
     $Inquiries = $this->generate('Inquiries', array(
      'components'=>array(
       'Email',  
       'Redirect', 
       'Session', 
       'Sms', 
      ) 
     )); 


     #expects one sms message 
     $Inquiries->Sms 
      ->expects($this->once()) 
      ->method('send') 
      ->will($this->returnValue(true)); 

     #expects two emails 
     $Inquiries->Email 
      ->expects($this->exactly(2)) 
      ->method('send') 
      ->will($this->returnValue(true)); 

     #expects flash success 

     $Inquiries->Redirect 
      ->expects($this->once()) 
      ->method('flashSuccess'); 

     #call add 
     $test = $this->testAction('/inquiries/add', array('data'=>$minimumInsertData, 'method'=>'post', 'return'=>'contents')); 
     debug($this->headers); 
     die; 
    } 
} 



class InquiriesController extends MastersController { 

    /* 
    * Name 
    */ 
    public $name = 'Inquiries'; 

    /* 
    * Attached Components 
    */ 
    public $components = array(  
     'Captcha', 
     'Email', 
     'PersistentValidation', 
     'Sms', 
    ); 

    /* 
    * Helpers 
    */ 
    public $helpers = array(
     'AjaxChat', 
    ); 

    /** 
    * Add 
    * @return void 
    */ 
    public function add(){ 
     $this->viewPath = 'Inquiries'; 
     $this->set("title_for_layout", 'Contact Us'); 
     if(!empty($this->request->data)) { 
      $this->request->data['Inquiry']['status_id'] = $this->Inquiry->Status->id('unresolved', 'inquiry'); 
      //$this->request->data['Inquiry']['user_id'] = $this->Auth->user('id'); 
      //$this->request->data['Inquiry']['account_id'] = $this->Auth->user('account_id'); 
      $this->request->data['Inquiry']['ip'] = env('REMOTE_ADDR'); 
      if($this->Inquiry->save($this->request->data)) { 

       #send SMS 
       if($this->sendSms) {      
        $smsToAso = array(
         'number'=>Configure::read('Inquiry.add.sms.number'), 
         'from'=>Configure::read('Inquiry.add.sms.from'), 
         'carrier'=>Configure::read('Inquiry.add.sms.carrier'), 
         'text'=>Configure::read('Inquiry.add.sms.text').' https://www.airsatone.com/admin/inquiries/view/'.$this->Inquiry->id, 
        ); 
        $this->Sms->send($smsToAso);      
       } 

       #send email 
       if($this->sendEmail){      
        #send user an email 
        $this->Email->template = Configure::read('Inquiry.add.email.template'); 
        $this->Email->to = $this->request->data['Inquiry']['email']; 
        $this->Email->from = Configure::read('Inquiry.add.email.from'); 
        $this->Email->subject = Configure::read('Inquiry.add.email.subject'); 
        $this->Email->message = Configure::read('Inquiry.add.email.message');     
        $this->Email->send(); 

        #send email to ASO     
        $message = '<p>ASO Inquiry from '.$this->request->data['Inquiry']['fname'].' '.$this->request->data['Inquiry']['lname']; 
        if(!empty($this->request->data['Inquiry']['company'])) $message .= ' at '.$this->request->data['Inquiry']['company'].'</p>'; 
        $message .= '<p>You may contact this individual by phone:'.$this->request->data['Inquiry']['phone'].' or email:'.$this->request->data['Inquiry']['email'].'</p>'; 
        $message .= $this->request->data['Inquiry']['inquiry']; 

        $this->Email->template = Configure::read('Inquiry.add.email_aso.template'); 
        $this->Email->to = Configure::read('Inquiry.add.email_aso.to'); 
        $this->Email->from = Configure::read('Inquiry.add.email_aso.from'); 
        $this->Email->subject = Configure::read('Inquiry.add.email_aso.subject'); 
        $this->Email->message = $message; 
        $this->Email->send(); 
       }   
       return $this->redirect(array('controller'=>'inquiries', 'action'=>'view', $this->Inquiry->id));    
       //return $this->Redirect->flashSuccess('Thanks for your inquiry, XXXXXX will be contacting you regarding your inquiry shortly.', array('controller'=>'inquiries', 'action'=>'view', $this->Inquiry->id)); 
      } else { 
return $this->redirect($this->referer()); 
       //return $this->Redirect->flashWarning('There was a problem submitting your form. Please check to make sure the form was filled out correctly.', $this->referer()); 
      } 
     } 
    } 
} 


class RedirectComponent extends Component { 

    /* 
    * Controller 
    */ 
    public $controller = null; 

    /* 
    * Components 
    */ 
    public $components = array('Session'); 

    /* 
    * Settings 
    */ 
    public $settings = array(); 

    /* 
    * Success 
    */ 
    public $success = null; 

    /* 
    * Warning 
    */ 
    public $warning = null; 

    /* 
    * Notice 
    */ 
    public $notice = null; 

    /* 
    * Config 
    */ 
    public $config = array(); 

    /** 
    * Initialize 
    * @param $controller 
    */ 
    public function initialize(&$controller){ 
     $this->controller = $controller; 
     $this->settings = array_merge(array('success'=>'success', 'warning'=>'warning', 'notice'=>'notice'), $this->config); 
     $this->success = $this->settings['success']; 
     $this->warning = $this->settings['warning']; 
     $this->notice = $this->settings['notice']; 
    } 

    /** 
    * Flash Success 
    * 
    * Redirects a user with a success flash message 
    * @param $msg 
    * @param $url 
    */ 
    public function flashSuccess($msg, $url=null){ 
     $this->Session->setFlash($msg, $this->success); 
     if(!empty($url)){ 
      return $this->controller->redirect($url, null, true); 
     } 
    } 

    /** 
    * Flash Warning 
    * 
    * Redirects a user with a warning flash message 
    * @param $msg 
    * @param $url 
    */ 
    public function flashWarning($msg, $url=null) { 
     $this->Session->setFlash($msg, $this->warning); 
     if(!empty($url)){ 
      return $this->controller->redirect($url, null, true); 
     } 
    } 

    /** 
    * Flash Notice 
    * 
    * Redirects a user with a notice flash message 
    * @param $msg 
    * @param $url 
    */ 
    public function flashNotice($msg, $url=null){ 
     $this->Session->setFlash($msg, $this->notice); 
     if(!empty($url)){ 
      return $this->controller->redirect($url, null, true); 
     } 
    } 

    /** 
    * Determines if an id is empty & sends a flash arning if it is. 
    * 
    * @param $id 
    * @param $url 
    * @param $msg 
    */ 
    public function idEmpty($id=null, $url=null, $msg='Invalid Id'){ 
     if (!$id && empty($this->controller->data)) { 
      $this->flashWarning($msg, $url); 
     } 
    } 
} 
+0

你嘲諷* *整體組件時,你將它添加到'generate()'方法而不指定特定的方法。這意味着這些方法都沒有實際被調用過。 – jeremyharris

回答

1

SessionComponent::flashSuccess()方法從來沒有真正執行,因爲你們嘲笑它。因此,它不能操縱$this->header。如果你想測試,如果你的重定向是正確的,你爲什麼不檢查,如果你的重定向函數調用正確的參數是這樣的:

$Inquiries->Redirect 
      ->expects($this->once()) 
      ->method('flashSuccess') 
      ->with('/where/it/should/redirect'); 
       // or whatever parameters it takes 
相關問題