php - 如何使用 CodeIgniter 测试 Controller ?

标签 php codeigniter

我有一个使用 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/

相关文章:

php part2中的phpmyadmin查询错误

php - 让 PDO 工作

php - 如何编写 mysql 查询以获得以下结果

php - mysql 显示查询的偏移量

php - Grocery CRUD 中的依赖下拉列表 (CodeIgniter)

php - Azure:使用存储模拟器时的帐户名和访问 key 是什么?

php - 将 DropDown 值保存到 Php MySQL

使用表单的 PHP HTTP 基本身份验证

php - CodeIgniter:从表单数组获取数据到帖子数组

PHP/SQL : Leveling/XP System for users on a website. 我应该如何存储数据?关于 session 的思考