0

アプリケーションのテストを書き始めており、すべてのリダイレクトを処理するラッパー RedirectComponent を作成しました。今、私は自分のアプリをテストし始めています (私はテストにかなり慣れていません)。 -複雑な例

$this->headers常に空白であるため、パラメーターでアサートを実行できないことを除いて、すべてが正常に機能しています。コントローラーリダイレクトメソッドを使用してコントローラーで直接リダイレクトすると、すべてが正常に機能し、$this->headers次のように設定されることがわかりました。

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

$this->headersただし、アプリ全体がこの RedirectComponent を使用しているため、このコンポーネントを使用してリダイレクトするコントローラー テストを作成するときに表示されるようにしたいと考えています。

私はすべてを正しく行っているようで、うまくいくはずなので、この問題を解決する方法については迷っています。

以下は私のコードです。

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@email.com',
                    '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);
        }
    }
}
4

1 に答える 1

1

あなたSessionComponent::flashSuccess()がそれを嘲笑したので、あなたのメソッドが実際に実行されることは決してありません。したがって、を操作することはできません$this->header。リダイレクトが正しいかどうかをテストする場合は、リダイレクト関数が次のような正しいパラメーターで呼び出されているかどうかを確認してみませんか。

$Inquiries->Redirect
            ->expects($this->once())
            ->method('flashSuccess')
            ->with('/where/it/should/redirect');
              // or whatever parameters it takes
于 2012-06-19T15:18:28.573 に答える