У меня есть веб-приложение PHP, построенное с использованием инфраструктуры CodeIgniter MVC. Я хочу протестировать различные классы контроллеров. Я использую Toast для модульного тестирования. У моих контроллеров нет состояния, все, что они обрабатывают, либо сохраняется в сеансе, либо передается на просмотр для отображения. Создание макетного объекта сеанса и проверка правильности его работы просто (просто создайте макет и добавьте его с помощью $ controller-> session = $ mock).Как проверить контроллеры с помощью CodeIgniter?
Что я не знаю, как работать с представлениями. В CodeIgniter, просмотры загружаются как:
$this->load->view($view_name, $vars, $return);
Поскольку я не хочу, чтобы изменить код CI, я, хотя я мог бы создать макет загрузчик и заменить оригинал. И здесь проблема, я не могу найти способ получить новый класс из CI_Loader.
Если я не включать/библиотеки/файл Loader.php системы, класс CI_Loader не определен, и я не могу наследовать от него:
class Loader_mock extends CI_Loader
Если я включить файл (используя require_once), Я получаю сообщение об ошибке:
Cannot redeclare class CI_Loader
Похоже, что сам код CI не использует require_once по любой причине.
У кого-нибудь есть опыт работы с модульным тестированием приложений с поддержкой CodeIgniter?
Edit: Я попытался придать реальный объект загрузчика во время выполнения в макете класса, и переадресовать все вызовы и переменные с __call, __set, __get, __isset и __unset. Но, похоже, это не работает (я не получаю никаких ошибок, но просто нет вывода, т. Е. Пустой страницы из Toast). Вот код:
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;
}
}
Хорошая идея, спасибо. –