2009-08-07 12 views
5

मैं SimpleTest 1.0.1 का उपयोग कर केकपीएचपी (केवल 1.2.4 जारी) के साथ एक नया एप्लीकेशन लिख रहा हूं। मैंने Cookbook के प्रासंगिक खंडों को पढ़ा है, Bakery पर खोज की है, और नियंत्रक परीक्षण (hard way और with mocks) पर मार्क स्टोरी की पोस्टिंग पढ़ें।केकपीएचपी नियंत्रकों के वास्तविक दुनिया परीक्षण?

दुर्भाग्य से, गैर-तुच्छ नियंत्रकों के वास्तविक-विश्व परीक्षण के बारे में इनमें से कोई भी वार्ता नहीं है। बहुत सारे ऐप्स लॉग इन के पीछे साइट के क्षेत्रों को डालते हैं, फिर भी मैं यह नहीं समझ सकता कि:

  • संरक्षित पृष्ठ रीडायरेक्ट तक अतिथि पहुंच का परीक्षण कैसे करें?
  • वैध प्रमाण-पत्र अपेक्षित सत्र चर सेट करता है?
  • अमान्य प्रमाण-पत्र त्रुटि संदेश के साथ लॉगिन पृष्ठ को फिर से प्रदर्शित करता है?

नियंत्रक और परीक्षण नीचे काम नहीं करते जैसा मैंने सोचा था कि वे करेंगे। दोनों कथनों असफल और मैं भी एक PHP त्रुटि मिलती है:

विफल [शून्य] [.../ऐप्स/परीक्षण/मामलों/नियंत्रक/users_controller.test.php लाइन 79] पर शून्य नहीं होना चाहिए ... /app/tests/cases/controllers/users_controller.test.php -> UsersControllerTest -> testLogin

विफल समान उम्मीद में विफल रहता है के रूप में [अमान्य] से मेल नहीं खाता [पूर्णांक: 1] [.../ऐप्स/परीक्षण पर /cases/controllers/users_controller.test.php लाइन 80] .../ऐप्स/परीक्षण/मामलों/नियंत्रक/users_controller.test.php -> UsersControllerTest -> testLogin

त्रुटि अप्रत्याशित PHP त्रुटि [अपरिभाषित अनुक्रमणिका: कार्रवाई] गंभीरता [E_NOTICE] [.../केक/libs/नियंत्रक/घटक/auth.php लाइन 266] .../ऐप/परीक्षण/मामलों/नियंत्रक/user_controller.test .php -> UsersControllerTest -> testLogin

यहाँ नियंत्रक (पके हुए प्लस मार्क कहानी के "मुश्किल तरीके से" परीक्षण विधि) है:

/* SVN FILE: $Id$ */ 
/* UsersController Test cases generated on: 2009-08-05 17:08:03 : 1249507923*/ 
App::import('Controller', 'Users'); 

class TestUsers extends UsersController 
{ 
    var $autoRender = false; 
    var $redirectUrl; 
    var $redirectStatus; 
    var $renderedAction; 
    var $renderedLayout; 
    var $renderedFile; 
    var $stopped; 

    function redirect($url, $status = null, $exit = true) 
    { 
    $this->redirectUrl = $url; 
    $this->redirectStatus = $status; 
    } 

    function render($action = null, $layout = null, $file = null) 
    { 
    $this->renderedAction = $action; 
    $this->renderedLayout = (is_null($layout) ? $this->layout : $layout); 
    $this->renderedFile = $file; 
    } 

    function _stop($status = 0) 
    { 
    $this->stopped = $status; 
    } 
} 

class UsersControllerTest extends CakeTestCase 
{ 
    var $fixtures = array('user'); 
    var $Users = null; 

    function startTest() 
    { 
    $this->Users = new TestUsers(); 
    $this->Users->constructClasses(); 
    $this->Users->Component->initialize($this->Users); 
    } 

    function prepareForAction() 
    { 
    $this->Users->beforeFilter(); 
    $this->Users->Component->startup($this->Users); 
    } 

    function endTest() 
    { 
    $this->Users->Session->destroy(); 
    unset($this->Users); 
    ClassRegistry::flush(); 
    } 

    //----------------------------------------------------------------------- 

    function testUsersControllerInstance() 
    { 
    $this->assertTrue(is_a($this->Users, 'UsersController')); 
    } 

    function testLogin() 
    { 
    $this->Users->data = array(
     'User' => array(
     'username' => 'admin', 
     'password' => 'admin' 
    ) 
    ); 

    $this->prepareForAction(); 
    $this->Users->login(); 

    $this->assertNotNull($this->Users->redirectUrl); 
    $this->assertEqual($this->Users->Session->read('Auth.User.id'), 1); 
    } 
} 

उत्तर

4

परीक्षण:

class UsersController extends AppController 
{ 
    var $name = 'Users'; 
    var $helpers = array('Html', 'Form'); 
    var $components = array('Auth'); 

    function login() 
    { 
    } 

    function logout() 
    { 
    $this->redirect($this->Auth->logout()); 
    } 

    function index() 
    { 
    $this->set('users', $this->paginate()); 
    } 

    function view($id = null) 
    { 
    if (!$id) 
    { 
     $this->Session->setFlash(__('Invalid User.', true)); 
     $this->redirect(array('action'=>'index')); 
    } 
    $this->set('user', $this->User->read(null, $id)); 
    } 

    function add() 
    { 
    if (!empty($this->data)) 
    { 
     $this->User->create(); 
     if ($this->User->save($this->data)) 
     { 
     $this->Session->setFlash(__('The User has been saved', true)); 
     $this->redirect(array('action'=>'index')); 
     } 
     else 
     { 
     $this->Session->setFlash(__('The User could not be saved. Please, try again.', true)); 
     } 
    } 
    } 

    function edit($id = null) 
    { 
    if (!$id && empty($this->data)) 
    { 
     $this->Session->setFlash(__('Invalid User', true)); 
     $this->redirect(array('action'=>'index')); 
    } 
    if (!empty($this->data)) 
    { 
     if ($this->User->save($this->data)) 
     { 
     $this->Session->setFlash(__('The User has been saved', true)); 
     $this->redirect(array('action'=>'index')); 
     } 
     else 
     { 
      $this->Session->setFlash(__('The User could not be saved. Please, try again.', true)); 
     } 
    } 
    if (empty($this->data)) 
    { 
     $this->data = $this->User->read(null, $id); 
    } 
    } 

    function delete($id = null) 
    { 
    if (!$id) 
    { 
     $this->Session->setFlash(__('Invalid id for User', true)); 
     $this->redirect(array('action'=>'index')); 
    } 
    if ($this->User->del($id)) 
    { 
     $this->Session->setFlash(__('User deleted', true)); 
     $this->redirect(array('action'=>'index')); 
    } 
    } 
} 

यहां परीक्षण है आप वास्तव में अपने उपयोगकर्ता कंटोलर का परीक्षण नहीं कर रहे हैं, आप वास्तव में एयू का परीक्षण कर रहे हैं thComponent। यदि आप ऐसा करना चाहते हैं तो आपको यह सुनिश्चित करना होगा कि आप अपने टेस्ट यूज़र कंट्रोलर को उसी तरह सेट अप करें जैसे यह आपके ऐप में होगा। अपने testLogin के मामले में आप नियंत्रक की कार्रवाई और यूआरएल निर्धारित करने की आवश्यकता:

function testLogin() 
{ 
$this->Users->data = array(
       'User' => array(
        'username' => 'admin', 
        'password' => 'admin' 
       ) 
      ); 

$this->Users->params['url']['url'] = '/users/login'; 
$this->Users->params['action'] = 'login'; 
$this->prepareForAction(); 
$this->Users->login(); 

$this->assertNotNull($this->Users->redirectUrl); 
$this->assertEqual($this->Users->Session->read('Auth.User.id'), 1); 
} 

वैकल्पिक रूप से, मैं Mark's mock objects post पर फिर से विचार करने और नियंत्रक कोड के लिए परीक्षण लिखने के लिए उन तरीकों का उपयोग और प्रमाणन घटक मजाक सुझाव है।

संबंधित मुद्दे