2014-04-19 29 views
1

我正在測試使用AppModel方法獲取登錄用戶的帳戶的控制器方法。問題是,我無法有效地模擬提供account_id的AppModel方法,而是在調試此值時變爲null。請讓我知道我錯過了什麼,或者如果我以錯誤的方式解決問題。如何模擬appModel方法返回AuthComponent值

AppModel.php包括:

/** 
* _getUser 
* 
* @param string $key from AuthComponent::user 
* @return string value from AuthComponent::user 
*/ 
    public function _getUser($key = null) { 
     return AuthComponent::user($key); 
    } 

AccountsController.php包括:

App::uses('AppController', 'Controller'); 
class AccountsController extends AppController { 

    public $name = 'Accounts'; 

/** 
* memberLetters - 
* Generate a letter to each member 
* 
**/ 
    function memberLetters() { 
     $account_id = $this->Account->_getUser('account_id'); 
     debug($account_id); // !!! returns null; expecting '1' !!! 
    } 
} 

用戶模型(user.php的)包括:

App::uses('AuthComponent', 'Controller/Component'); 
class User extends AppModel { 
    public $name = 'User'; 
    public $actsAs = array('Acl' => array('type' => 'requester')); 

    public $validate = array(
     'email' => array(
      'email' => array(
       'rule' => array('email'), 
       'message' => 'Email address required'), 
      'isUnique' => array(
       'rule' => array('isUnique'), 
       'message' => 'This email address is already associated with an account.') 
     ), 
     'password' => array(
      'notempty' => array(
       'rule' => array('notempty'), 
       'message' => 'Password required', 
      ), 
     ), 
     'account_id' => array(
      'numeric' => array(
       'rule' => array('numeric'), 
      ), 
     ), 
    ); 

    public $belongsTo = array('Account'); 
} 

測試代碼:AccountsControllerTest.php包括:

App::uses('AccountsController', 'Controller'); 
class AccountsControllerTest extends ControllerTestCase { 

/** 
* Fixtures 
* 
* @var array 
*/ 
    public $fixtures = array(
     'app.account', 
     'app.user', 
    ); 

/** 
* testMemberLetters method 
* 
* @return void 
*/ 
    public function testMemberLetters() { 
     $model = $this->getMockForModel('Account', array('_getUser'), array()); 

     $model 
      ->expects($this->exactly(1)) 
      ->method('_getUser', array('account_id')) 
      ->will($this->returnValue(1)); 

     $result = $this->testAction(
      'accounts/memberLetters', 
      array(
       'method' => 'get', 
       'return' => 'vars', 
      ) 
     ); 


} 
+0

在哪裏調用testAction在你r控制器測試方法? – AD7six

+0

哎呀! (我編輯它) –

回答

0

我解決了這個問題,通過將Model :: get_User()調用從AccountsController代碼和Account類型代碼中重構出來。這使它成爲可測試的。感謝TimKoschützkihttp://debuggable.com/posts/implementing-different-types-for-cakes-modelfind-method:485030de-4778-456e-8400-44d84834cda3我發現下面的方法來覆蓋模型 - >找到:

Accounts.php包括

function find($type = string, $queryData = array()) { 
    switch ($type) { 
     case 'mine': 
      if (!in_array('conditions', $queryData)) { 
       $queryData['conditions'] = 
        array('id' => $this->_getUser('account_id')); 
      } else { 
       $queryData['conditions'] .= 
        array('id' => $this->_getUser('account_id')); 
      } 
      return parent::find('first', $queryData); 
     default: 
      return parent::find($type, $queryData); 
    } 
} 

所以現在我AccountsController方法可以簡單地調用

$data = $this->Account->find('mine'); 

,並在我的AccountsControllerTest我寫

public function testMemberLetters() { 
    $this->controller = $this->generate('Accounts', array(
     'models' => array(
      'Account' => array('_getUser') 
     ) 
    )); 

    $this->controller->Account->expects($this->exactly(1)) 
     ->method('_getUser') 
     ->with('account_id') 
     ->will($this->returnValue(1)); 

    $result = $this->testAction(
     'accounts/memberLetters', 
     array(
      'method' => 'get', 
      'return' => 'vars', 
     ) 
    ); 
} 
相關問題