Rozważmy następujący kod:CakePHP Testowanie kontrolera z elementem bezpieczeństwa
kod kontrolera
<?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);
}
}
}
Zobacz Kod
<?php
echo $this->Form->create();
echo $this->Form->input('name');
echo $this->Form->end('Submit');
Ponieważ mam komponent zabezpieczeń w miejscu, sabotaż z formularzem w jakikolwiek sposób (takim jak dodanie do niego pola) spowoduje, że żądanie będzie czarne-h oled. Chciałbym przetestować:
kod testowy
<?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']);
}
}
Drugi test testExamplePostInvalidData
powinna zawieść z powodu some_field
będącego w tablicy $data
, ale to przechodzi! Co ja robię źle?
Ta odpowiedź mnie myśleć możliwość sprawdzenia, co zwraca widok w GET i zobacz, czy zawiera pola, które nie powinny być edytowalne. Następnie, wiedząc, że komponent Security jest włączony, wiem, że jestem bezpieczny. Ale myślę, że mój test ma sens, ponieważ testy nie dbają o to, jaka jest twoja implementacja; testy tylko dbają o wynik. Zatem wynik umieszczania pól, które nie powinny być edytowalne, powinien skutkować błędem, niezależnie od tego, czy wygenerowany z komponentu Security, czy też nie (test nie dba o to). Ale myślę, że ta odpowiedź wystarcza. Dziękuję Ci! – Nick