Próbuję przetestować działanie kontrolera, który umożliwia edycję profili użytkowników. Między innymi chcę przetestować, że każdy zalogowany użytkownik może edytować tylko swój profil, a nie inny. W przypadku zerwania tego ograniczenia akcja musi przekierować na wcześniej zdefiniowaną stronę główną.Napisz do kontrolera, który używa AuthComponent w CakePHP 2
Przy tym scenariuszu, mam urządzenie, które tworzy użytkownika o ID = 1. Tak myślałem na testowaniu ograniczenie w ten sposób:
$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');
Test przechodzi tego dochodzić. Więc następnym krokiem jest sprawdzenie, czy wykonanie '/users/edit/1'
, który ma identyfikator zalogowanego użytkownika, pokazuje postać:
$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');
Jednak to assert kończy się niepowodzeniem. Po kopania wokół z debug()
Znalazłem że $this->Auth->user()
zwraca całą informację ale $this->Auth->user('id')
powraca null
. Ponieważ używam tego ostatniego w porównaniu w akcji, wartość ta jest fałszywa i powoduje niepowodzenie testu .
Ciekawostką jest to, że dzieje się podczas testowania, ale nie podczas wykonywania działań w przeglądarce. Jaki jest więc właściwy sposób testowania tej akcji?
Dzięki!
Jaki jest sens korzystania z 'ControllerTestCase', jeśli musisz mimo to używać' generate() '? – elitalon
generate() jest dostępny tylko w ControllerTestCase i jest udostępniany w celu ułatwienia testAction(), np. Możliwość udawania metod kontrolera, komponentów, modeli itp. Jeśli nie wywołasz samodzielnie funkcji generate(), to testAction () zrobi to wewnętrznie dla ciebie z domyślnymi ustawieniami CakePHP (kpiąc z funkcji _stop() i przekierowania()) –
Myślałem, że 'generate()' faktycznie zrobił coś innego. Dlatego ciągle zastanawiałem się, dlaczego go użyć, jeśli 'ControllerTestCase' dostarczył mi domyślną konfigurację. Spróbuję twojej odpowiedzi i dam ci znać :) – elitalon