2013-05-10 3 views
6

Рассмотрим этот код:CakePHP Тестирование контроллера с компонентом безопасности

контроллера Код

<?php 
App::uses('AppController', 'Controller'); 

class UsersController extends AppController { 

    public $components = array(
     'Security', 
     'Session' 
    ); 

    public function example() { 
     if ($this->request->is('post')) { 
      $this->set('some_var', true); 
     } 
    } 
} 

View Code

<?php 

echo $this->Form->create(); 
echo $this->Form->input('name'); 
echo $this->Form->end('Submit'); 

Поскольку у меня есть компонент безопасности на месте, саботажа с формой каким-либо образом (например, добавление поля к ней) приведет к тому, что запрос будет черно-h ОСИД. Я хотел бы, чтобы проверить это:

Код проверки

<?php 

class UsersControllerTest extends ControllerTestCase { 

    public function testExamplePostValidData() { 
     $this->Controller = $this->generate('Users', array(
      'components' => array(
       'Security' 
      ) 
     )); 

     $data = array(
      'User' => array(
       'name' => 'John Doe' 
      ) 
     ); 

     $this->testAction('/users/example', array('data' => $data, 'method' => 'post')); 
     $this->assertTrue($this->vars['some_var']); 
    } 

    public function testExamplePostInvalidData() { 
     $this->Controller = $this->generate('Users', array(
      'components' => array(
       'Security' 
      ) 
     )); 

     $data = array(
      'User' => array(
       'name' => 'John Doe', 
       'some_field' => 'The existence of this should cause the request to be black-holed.' 
      ) 
     ); 

     $this->testAction('/users/example', array('data' => $data, 'method' => 'post')); 
     $this->assertTrue($this->vars['some_var']); 
    } 
} 

Второй тест testExamplePostInvalidData должен потерпеть неудачу из-some_field, находящегося в $data массиве, но она проходит! Что я делаю не так?

ответ

1

Добавив «some_field» в данные -> testAction, компонент безопасности будет считать, что это поле является частью вашего приложения (поскольку оно исходит из вашего кода, а не массива POST), поэтому его не будет видно как «попытка взлома».

Проверка черных дыр немного запутана. Но тесты Core Cake уже тестируют функциональность blackhole, поэтому, если эти тесты проходят, вам не нужно проверять их в своем приложении.

Если вы настаиваете, хотя, проверить тесты основной торт для руководства:

В частности:

/** 
* test that validatePost fails if any of its required fields are missing. 
* 
* @return void 
*/ 
public function testValidatePostFormHacking() { 
    $this->Controller->Security->startup($this->Controller); 
    $key = $this->Controller->params['_Token']['key']; 
    $unlocked = ''; 

    $this->Controller->request->data = array(
     'Model' => array('username' => 'nate', 'password' => 'foo', 'valid' => '0'), 
     '_Token' => compact('key', 'unlocked') 
    ); 
    $result = $this->Controller->Security->validatePost($this->Controller); 
    $this->assertFalse($result, 'validatePost passed when fields were missing. %s'); 
} 

Много больше примеров в файле:
https://github.com/cakephp/cakephp/blob/master/lib/Cake/Test/Case/Controller/Component/SecurityComponentTest.php

+0

Этот ответ заставил меня думать возможность просто проверить, что представление возвращается в GET, и посмотреть, содержит ли он поля, которые не должны редактироваться. Затем, зная, что компонент безопасности включен, я знаю, что я в безопасности. Но я думаю, что мой тест по-прежнему имеет смысл, потому что тесты не волнуют, какова ваша реализация; тесты только заботятся об итогах. Таким образом, результат размещения полей, которые не должны редактироваться, должен приводить к ошибке, независимо от того, генерируется ли она из компонента безопасности или нет (тест не волнует). Но я думаю, что этого ответа достаточно. Спасибо! – Nick

Смежные вопросы