无法在codeigniter上运行phpunit测试,CI未找到错误

我在codeigniter上运行PHPunit测试,我有一段带有这段代码的admin_test.PHP文件.

class Admin_test extends PHPUnit_Framework_TestCase{
    private $CI;

    public function __construct()
    {
        // create instance variable
        $this->CI = &get_instance();


    }


    public function testRenderReturnsHelloWorld(){
        $this->CI->load->controller('admin');
        $data = $this->admin->render();
        $expected = 'Hello World';
        $this->assertEquals($expected, $data);
    }
}

当我运行PHPunit测试时,我收到此错误.

PHP Fatal error:  Call to undefined function get_instance() in C:\Users\farhana\Desktop\ci\tests\application\controllers\admin_test.PHP on line 16
PHP Stack trace:
PHP   1. {main}() 

我使用composer来获得PHPunit测试,所以在其他教程之后无法工作,因为composer正在加载bootstrap.PHP文件

这是我的PHPunit.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<PHPunit bootstrap="./vendor/autoload.PHP"
         color = "true"
         convertErrorsToExpections="true"
         convertNoticesToExceptions="true"
         convertWarningsToExpections="true"
         SyntaxCheck="false"
         >
    <testsuites>
        <testsuite name="Unit Tests">
            <directory>./tests/application/controllers/admin_test.PHP</directory>
        </testsuite>
    </testsuites>
</PHPunit>

解决方法:

我对CI并不熟悉,但有机会使用使用它的代码库.问题是函数& get_isntance()在system/core/CodeIgniter.php文件中定义.所以(似乎)你可以包含它以便能够使用该功能(你可以创建一些特殊的引导程序文件,包含这个文件vendor / autoload.PHP).

我通过意图强调’似乎’,因为实际上该文件已经为某些常量设置了一些要求(以及其他一些已完成的东西 – 如index文件中所述).除了定义get_instance函数之外,它还有很多side-effects – 它包含其他文件,实例化对象(也可以自己创建作业),注册错误和异常处理程序,处理404情况,创建控制器及其运行方法,运行它,调用钩子并在所有这些之间进行基准测试.基本上大多数这些操作与测试过程无关,特别是在谈论单元测试时.所以我认为包含该文件并不是一个好主意(尽管可能有用 – 我没有检查).

这使得一个人可以选择 – 检查所有CI引导代码提取所有适合并且需要进行单元测试并运行它们的东西.或者放弃基于CI的代码进行单元测试的想法,尝试不那么深入和更集成的东西:Codeception提供的functional/acceptance测试(或搜索其他类似的工具).

就个人而言,我认为第一种选择不值得做出这些努力的原因很明显.因此,如果您必须执行CI并且想要进行一些测试,那么不进入其内部并专注于要测试的代码的外部边界将更有效率.

(不能说我已经完成了对基于CI的代码进行实际单元测试的全面覆盖和全面搜索,但似乎(即使只考虑关于该主题的SO主题的简短搜索)这是一个非常大的问题.所以如果你设法解决任何问题,那么看看你采取的方法会很有趣.)

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...