/ / cakephp: testovanie presmerovania - php, unit-testing, cakephp, phpunit

cakephp: testovanie redirect - php, unit-testing, cakephp, phpunit

Snažím sa viazať na testovanie presmerovania v mojom testovacom kóde jednotky. Kód kontrolóra je:

public function redirection() {
$this->redirect(array("action" => "index"));
return ;
}

a testovací kód je:

public function testRedirection() {
$return_var = $this->testAction("/users/redirection", array("return"=>"vars"));
$results = $this->headers["Location"];
var_dump( $this->headers["Location"]);
}

a výstup:

string(55) "http://localhost/var/www/html/cakephp/app/Console/users"

Moja otázka znie, ako sa môžem zbaviť celého reťazca „var / www / html / cakephp / app / Console“, a za druhé, prečo v ňom nie je „index“?

odpovede:

2 pre odpoveď č. 1

Upravte ovládač na niečo podobné

public function redirection() {
return $this->redirect(array("action" => "index"));
}

Dôvodom je (citácia knihy)

Pri testovaní akcií, ktoré obsahujú presmerovanie () apo presmerovaní je zvyčajne vhodné vrátiť sa pri presmerovaní. Dôvodom je to, že presmerovanie () je v testovaní zosmiešňované a nevykonáva sa ako obvykle. Namiesto ukončenia vášho kódu bude kód naďalej presmerovávať. Napríklad:

class ArticlesController extends AppController {
public function add() {
if ($this->request->is("post")) {
if ($this->Article->save($this->request->data)) {
$this->redirect(array("action" => "index"));
}
}
// more code
}
}

Pri testovaní vyššie uvedeného kódu budete stále používať // ďalší kód, aj keď je dosiahnuté presmerovanie. Namiesto toho by ste mali napísať kód ako:

class ArticlesController extends AppController {
public function add() {
if ($this->request->is("post")) {
if ($this->Article->save($this->request->data)) {
return $this->redirect(array("action" => "index"));
}
}
// more code
}
}

V tomto prípade // ďalší kód nebude vykonaný, pretože metóda sa vráti po dosiahnutí presmerovania.