Tengo una aplicación web PHP construida con framework CodeIgniter MVC. Deseo probar varias clases de controlador. Estoy usando Toast para pruebas unitarias. Mis controladores no tienen estado, todo lo que procesan se guarda en la sesión o se pasa a la vista para mostrar. Crear un objeto de sesión simulado y probar si funciona correctamente es sencillo (solo crea un objeto falso e inyéctalo con $ controller-> session = $ mock).¿Cómo probar los controladores con CodeIgniter?
Lo que no sé, es cómo trabajar con vistas. En CodeIgniter, las vistas se cargan como:
$this->load->view($view_name, $vars, $return);
Ya que no quiero alterar el código IC, aunque yo podría crear una maqueta del cargador y reemplazar el original. Y aquí radica el problema, no puedo encontrar una manera de derivar una nueva clase de CI_Loader.
Si no incluyo el sistema de bibliotecas de archivos// Loader.php, la CI_Loader clase no está definido y no puede heredar de ella:
class Loader_mock extends CI_Loader
Si hago incluir el archivo (utilizando require_once), Obtengo el error:
Cannot redeclare class CI_Loader
Parece que el código CI en sí mismo no utiliza require_once por ningún motivo.
¿Alguien aquí tiene experiencia con pruebas unitarias de aplicaciones con motor CodeIgniter?
Editar: Me trataron de inyectar un objeto cargador real en tiempo de ejecución en un simulacro de clase, y redirigir todas las llamadas y las variables con __call, __set, __get, __isset y __unset. Pero, parece que no funciona (no obtengo ningún error, simplemente no hay salida, es decir, una página en blanco de Toast). Aquí está el código:
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;
}
}
Buena idea, gracias. –