2015-01-09 4 views
0

КодCakePHP UnitTest издевались компонент Auth

class AclRowLevelsController extends AppController { 

    public $components = array(
     // Don't use same name as Model 
     '_AclRowLevel' => array('className' => 'AclRowLevel') 
    );  

    public function view() { 
     $this->_AclRowLevel->checkUser();   
     ... 
    } 

} 

class AclRowLevelComponent extends Component { 

    public function initialize(Controller $controller) { 
     $this->controller = $controller; 
     $this->AclRowLevel = ClassRegistry::init('AclRowLevel'); 
    } 

    public function checkUser($permission, $model) { 
     $row = $this->AclRowLevel->find('first', array(
      'conditions' => array(
       'model' => $model['model'], 
       'model_id' => $model['model_id'], 
       'user_id' => $this->controller->Auth->user('id') 
      ) 
     ));  
    } 

} 

class AclRowLevelsControllerTest extends ControllerTestCase { 

    public function testViewAccessAsManager() { 

     $AclRowLevels = $this->generate('AclRowLevels', array(
      'components' => array(
       'Auth' => array(
        'user' 
       ), 
       'Session', 
      ) 
     )); 

     $AclRowLevels->Auth 
      ->staticExpects($this->any()) 
      ->method('user') 
      ->with('id') 
      ->will($this->returnValue(1)); 

     $this->testAction('/acl_row_levels/view/Task/1'); 
} 

Проблема

Запрос в компоненте AclRowLevel требует идентификатор пользователя Auth. Я хочу имитировать значение user_id '1' для модульного теста. Изделенный метод «пользователь» метода Auth в моем тесте не работает для вызова из компонента. Таким образом, идентификатор пользователя в этом запросе имеет значение null.

Как это сделать?

ответ

0

Сделайте debug($AclRowLevels->Auth);, чтобы проверить, действительно ли это насмехалось. Это должен быть макет объекта. Если это не по какой-то причине попытки:

$AclRowLevels->Auth = $this->getMock(/*...*/); 

Код внутри CheckUser() должны идти в модель, кстати. Также я сомневаюсь, что это должен быть компонент вообще. Кажется, это используется для авторизации, так почему бы не making it a proper authorization adapter?

+0

Объект Auth уже издевался? см. $ this-> generate. Есть причина, почему этот код находится в компоненте. Здесь не все показано, так как это не относится к проблеме. – user2511309

+0

Нет, это не так. Если это действительно так? – burzum

+0

$ AclRowLevels = $ this-> генерировать ... правильно? Не могли бы вы точно указать, что я должен добавить. Я новичок в модульном тестировании. – user2511309

0

Это то, что я искал:

$AclRowLevels->Auth 
     ->staticExpects($this->any()) 
     ->method('user') 
     ->will($this->returnCallback(
      function($arg) { 
       if ($arg === 'id') { 
        return 1; 
       } 
       return null; 
      } 
     ));