sto cercando di testare un'azione di controllo che consente edizione di profili utente. Tra le altre cose voglio testare che ogni utente registrato possa modificare solo il proprio profilo e non quello degli altri. In caso di violazione di questa restrizione, l'azione deve reindirizzare a una pagina iniziale predefinita.scrivere per un controller che utilizza AuthComponent in CakePHP 2
Con questo scenario, ho un appuntamento fisso che crea un utente con ID = 1. Stavo pensando sul test del restrizione in questo modo:
$data = $this->Users->User->read(null, 1);
$this->Users->Auth->login($data);
$this->testAction('/users/edit/2', array('method' => 'get'));
$url = parse_url($this->headers['Location']);
$this->assertEquals($url['path'], '/homepage');
Il test viene superato questo assert. Quindi il passo successivo è quello di verificare se l'esecuzione di '/users/edit/1'
, che ha l'ID dell'utente collegato, mostra la forma:
$this->testAction('/users/edit/1', array('method' => 'get', 'return' => 'vars'));
$matcher = array(
'tag' => 'form',
'ancestor' => array('tag' => 'div'),
'descendant' => array('tag' => 'fieldset'),
);
$this->assertTag($matcher, $this->vars['content_for_layout'], 'The edition form was not found');
Tuttavia questa asserzione fallisce. Dopo aver scavato in giro con debug()
ho trovato che $this->Auth->user()
restituisce tutta l'informazione, ma $this->Auth->user('id')
rendimenti null
. Da quando uso quest'ultimo in un confronto all'interno dell'azione, valuta come falso e provoca la prova di sicuro.
La cosa curiosa è che accade durante il test, ma non quando si esegue l'azione in un browser. Quindi, qual è il modo corretto di testare questa azione?
Grazie!
Qual è il punto allora di usare 'ControllerTestCase' se devi usare' generate() 'comunque? – elitalon
generate() è disponibile solo in ControllerTestCase ed è fornito per rendere più semplice testAction(), come essere in grado di simulare metodi, componenti, modelli di controller, ecc. Se non si chiama generate(), quindi testAction () lo farà internamente per te con i default di CakePHP (mocking the _stop() e la funzione redirect()) –
Ho pensato che 'generate()' in realtà ha fatto qualcos'altro. Ecco perché ho continuato a pensare perché usarlo se "ControllerTestCase" mi ha fornito una configurazione predefinita. Proverò la tua risposta e ti faccio sapere :) – elitalon