Comment tester les contrôleurs avec CodeIgniter?
J'ai une application web PHP construit avec CodeIgniter framework MVC. Je souhaite tester les différentes classes de contrôleur. Je suis en utilisant Toast pour les tests unitaires. Mon contrôleurs ont pas d'état, tout est soit enregistré dans la session ou transmis à l'affichage. La création d'une simulation de session de l'objet et de tester si qui fonctionne correctement est simple (il suffit de créer un objet fantaisie et à y injecter $controller->session = $simulacre).
Ce que je ne sais pas, c'est comment de travailler avec des points de vue. Dans CodeIgniter, les vues sont chargés de:
$this->load->view($view_name, $vars, $return);
Car je ne veux pas modifier code de CI, j'ai pensé que je pouvais créer une maquette Chargeur et remplacer l'original. Et c'est là que réside le problème, je ne peux pas trouver un moyen de dériver une nouvelle classe de CI_Loader.
Si je ne comprend pas le system/libraries/Loader.php fichier, la classe CI_Loader est pas défini et je ne peut pas hériter d'elle:
class Loader_mock extends CI_Loader
Si je dois inclure le fichier (à l'aide de require_once), j'obtiens l'erreur:
Cannot redeclare class CI_Loader
Ressemble à CI code lui-même ne pas utiliser require_once quelle qu'en soit la raison.
Ce que quelqu'un ici a de l'expérience avec les tests unitaires CodeIgniter applications alimentées?
Edit: j'ai essayé d'injecter un véritable objet loader au moment de l'exécution dans un simulacre de classe, et de rediriger tous les appels et les variables avec __appel, __set, __get, __isset et __ _ _ unset. Mais, il ne semble pas fonctionner (je n'ai pas des erreurs si seulement, pas de sortie, c'est à dire vierge de la page de pain grillé). Voici le code:
class Loader_mock
{
public $real_loader;
public $varijable = array();
public function Loader_mock($real)
{
$this->real_loader = $real;
}
public function __call($name, $arguments)
{
return $this->real_loader->$name($arguments);
}
public function __set($name, $value)
{
return $this->real_loader->$name = $value;
}
public function __isset($name)
{
return isset($this->real_loader->$name);
}
public function __unset($name)
{
unset($this->loader->$name);
}
public function __get($name)
{
return $this->real_loader->$name;
}
public function view($view, $vars = array(), $return = FALSE)
{
$varijable = $vars;
}
}
source d'informationauteur Milan Babuškov
Vous devez vous connecter pour publier un commentaire.
Alternativement, vous pourriez faire ceci:
Puis dans votre contrôleur n' $this->load = new MockLoader().
Ma solution actuelle est de modifier la CodeIgniter code à utiliser require_once au lieu de l'exiger. Voici le patch, je vais l'envoyer à CI, les développeurs dans le cas où quelqu'un doit faire de même jusqu'à ce qu'ils l'acceptent:
Je ne peux pas beaucoup vous aider avec les tests, mais je peux vous aider à étendre le CI de la bibliothèque.
Vous pouvez créer votre propre
MY_Loader
classe à l'intérieur de/application/libraries/MY_Loader.php
.CodeIgniter va voir ce automatiquement. Il suffit de mettre dans les fonctions que vous souhaitez remplacer dans la bibliothèque d'origine. Tout le reste va utiliser l'original.
Pour plus d'info consultez le CI page de manuel pour la création de base du système de classes.
Je suis impressionné par le code que vous essayez d'utiliser.
Alors maintenant, je me demande comment les "Crochets" classe de CodeIgniter pourrait être d'une aide quelconque à votre problème?
http://codeigniter.com/user_guide/general/hooks.html
Salutations,
Rein Groot
Le contrôleur ne doit pas contenir domaine de la logique, de sorte que les tests unitaires n'ont pas de sens ici.
Au lieu de cela, je voudrais tester les contrôleurs et les vues des tests d'acceptation.