如何使用CodeIgniter测试控制器?

Mil*_*kov 12 php codeigniter

我有一个使用CodeIgniter MVC框架构建的PHP Web应用程序.我想测试各种控制器类.我正在使用Toast进行单元测试.我的控制器没有状态,它们处理的所有内容都保存到会话中或传递给视图显示.创建一个模拟会话对象并测试它是否正常工作很简单(只需创建一个模拟对象并使用$ controller-> session = $ mock注入它).

我不知道的是,如何使用视图.在CodeIgniter中,视图加载为:

$this->load->view($view_name, $vars, $return);
Run Code Online (Sandbox Code Playgroud)

由于我不想改变CI代码,我虽然可以创建一个模拟Loader并替换原始代码.这就是问题所在,我找不到从CI_Loader派生新类的方法.

如果我不包含system/libraries/Loader.php文件,那么类CI_Loader是未定义的,我不能继承它:

class Loader_mock extends CI_Loader
Run Code Online (Sandbox Code Playgroud)

如果我确实包含该文件(使用require_once),我会收到错误:

Cannot redeclare class CI_Loader
Run Code Online (Sandbox Code Playgroud)

看起来CI代码本身不会出于任何原因使用require_once.

这里有没有人有单元测试CodeIgniter驱动的应用程序的经验?

编辑:我试图在运行时将一个真正的加载器对象注入一个模拟类,并使用__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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Kev*_*vin 4

或者,您可以这样做:

$CI =& get_instance();
$CI = load_class('Loader');

class MockLoader extends CI_Loader
{
    function __construct()
    {
        parent::__construct();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的控制器中执行 $this->load = new MockLoader()。