我有一个使用 CodeIgniter MVC 框架构建的 PHP Web 应用程序。我想测试各种 Controller 类。我正在使用Toast用于单元测试。我的 Controller 没有状态,它们处理的所有内容要么保存到 session 中,要么传递到 View 以显示。创建一个模拟 session 对象并测试其是否正常工作非常简单(只需创建一个模拟对象并使用 $controller->session = $mock 注入(inject)它)。
我不知道的是如何使用 View 。在 CodeIgniter 中, View 加载为:
$this->load->view($view_name, $vars, $return);
由于我不想更改 CI 代码,因此我认为可以创建一个模拟加载器并替换原始加载器。问题就在这里,我找不到从 CI_Loader 派生新类的方法。
如果我不包含 system/libraries/Loader.php 文件,则 CI_Loader 类未定义,我无法从中继承:
class Loader_mock extends CI_Loader
如果我确实包含该文件(使用 require_once),则会收到错误:
Cannot redeclare class CI_Loader
看起来 CI 代码本身无论出于何种原因都没有使用 require_once。
这里有人有单元测试 CodeIgniter 支持的应用程序的经验吗?
编辑:我尝试在运行时将真实的加载器对象注入(inject)模拟类,并使用 __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;
}
}
最佳答案
或者,您可以这样做:
$CI =& get_instance();
$CI = load_class('Loader');
class MockLoader extends CI_Loader
{
function __construct()
{
parent::__construct();
}
}
然后在你的 Controller 中执行 $this->load = new MockLoader()。
关于php - 如何使用 CodeIgniter 测试 Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1139391/