Ho un'applicazione Web PHP realizzata con framework CodeIgniter MVC. Vorrei testare varie classi di controller. Sto usando Toast per il test delle unità. I miei controller non hanno lo stato, tutto ciò che elaborano viene salvato in sessione o passato per essere visualizzato. Creare un oggetto di sessione di simulazione e testare se funziona correttamente è semplice (basta creare un oggetto fittizio e iniettarlo con $ controller-> session = $ mock).Come testare i controller con CodeIgniter?
Quello che non so è come lavorare con le viste. In CodeIgniter, viste vengono caricati come:
$this->load->view($view_name, $vars, $return);
Dato che non voglio alterare il codice CI, io però ho potuto creare un finto Loader e sostituire l'originale. E qui sta il problema, non riesco a trovare un modo per ottenere una nuova classe da CI_Loader.
Se io non includono il/librerie file system/Loader.php, il CI_Loader di classe non è definita e non può ereditare da esso:
class Loader_mock extends CI_Loader
Se faccio includere il file (utilizzando require_once), Ho ricevuto l'errore:
Cannot redeclare class CI_Loader
Sembra che il codice CI stesso non usi require_once per qualsiasi motivo.
Qualcuno qui ha esperienza con le applicazioni di test dell'unità CodeIgniter?
Edit: ho cercato di iniettare un oggetto loader reale al run-time in una classe finto, e reindirizzare tutte le chiamate e variabili con __call, __set, __get, __isset e __unset. Ma non sembra funzionare (non ho alcun errore però, solo nessun output, cioè una pagina vuota di Toast). Ecco il codice:
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;
}
}
Bella idea, grazie. –