如何测试使用CodeIgniter控制器?(How to test controllers with

2019-07-30 07:52发布

我有一个笨MVC框架构建一个PHP Web应用程序。 我想测试各种控制器类。 我使用吐司的单元测试。 我的控制器没有状态,它们处理一切要么保存到会话或传递给视图显示。 创建一个模拟会话对象和测试是否可以正常工作非常简单(只需要创建一个模拟对象,并与控制器 - $>会议= $模拟注入的话)。

我不知道,是如何与视图的工作。 在笨,视图加载为:

$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供电的应用体验?

编辑:我试图注入在运行时真正的装载机对象转换成模拟类和重定向与__call,__set,__get,__isset和__unset所有通话和变量。 但是,这似乎并没有工作(我没有得到任何错误,虽然,只是没有输出,即空白页从面包)。 下面的代码:

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;
    }
}

Answer 1:

或者,你可以这样做:

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

class MockLoader extends CI_Loader
{
    function __construct()
    {
        parent::__construct();
    }
}

然后在你的控制器做$这个 - >负荷=新MockLoader()。



Answer 2:

我目前的解决办法是改变笨代码使用require_once,而不是要求。 下面是我要发送到的情况下,有人需要,直到他们接受它做同样的CI开发补丁:

diff --git a/system/codeigniter/Common.php b/system/codeigniter/Common.php
--- a/system/codeigniter/Common.php
+++ b/system/codeigniter/Common.php
@@ -100,20 +100,20 @@ function &load_class($class, $instantiate = TRUE)
        // folder we'll load the native class from the system/libraries folder.
        if (file_exists(APPPATH.'libraries/'.config_item('subclass_prefix').$class.EXT))
        {
-               require(BASEPATH.'libraries/'.$class.EXT);
-               require(APPPATH.'libraries/'.config_item('subclass_prefix').$class.EXT);
+               require_once(BASEPATH.'libraries/'.$class.EXT);
+               require_once(APPPATH.'libraries/'.config_item('subclass_prefix').$class.EXT);
                $is_subclass = TRUE;
        }
        else
        {
                if (file_exists(APPPATH.'libraries/'.$class.EXT))
                {
-                       require(APPPATH.'libraries/'.$class.EXT);
+                       require_once(APPPATH.'libraries/'.$class.EXT);
                        $is_subclass = FALSE;
                }
                else
                {
-                       require(BASEPATH.'libraries/'.$class.EXT);
+                       require_once(BASEPATH.'libraries/'.$class.EXT);
                        $is_subclass = FALSE;
                }
        }


Answer 3:

我帮不了你多少与测试,但我可以帮你延长CI库。

你可以创建自己的MY_Loader内部类/application/libraries/MY_Loader.php

<?php
  class MY_Loader extends CI_Loader {

    function view($view, $vars = array(), $return = FALSE) {
      echo 'My custom code goes here';
    }

  }

笨就会自动看到这一点。 只要把你想在原有的库替换功能。 一切将使用原来的。

欲了解更多信息请查看CI手册页创建核心系统类 。



Answer 4:

我对您要使用的代码留下深刻的印象。

所以现在我想知道如何在“鱼钩”类笨的可能是你的问题的任何帮助吗?

http://codeigniter.com/user_guide/general/hooks.html

亲切的问候,瑞鹰格鲁特



Answer 5:

该控制器不应该包含域逻辑,所以单元测试没有意义在这里。

相反,我会测试控制器和视图与验收测试。



文章来源: How to test controllers with CodeIgniter?