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

时间:2017-08-07 17:08:12

标签: php codeigniter phpunit

我在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测试,因此在编写器加载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>

3 个答案:

答案 0 :(得分:0)

我对CI并不熟悉,但有机会使用使用它的代码库。问题是function &get_isntance()文件中定义了include。所以(似乎)你可以vendor/autoload.php它能够使用该函数(你可以创建一些特殊的引导文件,包含这个文件和get_instance)。

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

留下一个选择 - 要么检查所有CI引导代码并提取所有适合并且需要进行单元测试并运行它们的东西。或者放弃基于CI的代码进行单元测试的想法,尝试更深入,更整合的东西:Codeception提供的side-effects测试(或搜索其他类似的工具)。

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

(不能说我已经对基于CI的代码进行了真正的单元测试进行了全面覆盖和全面的搜索,但似乎(即使只考虑关于该主题的SO主题的简短搜索)它是相当的因此,如果你设法解决任何问题,那么看看你采取的方法会很有趣。)

答案 1 :(得分:0)

对于其他为此感到困扰的人,请尝试rougin/spark-plug

答案 2 :(得分:0)

您的行显示为:

$this->CI = &get_instance();

但是必须是:

$this->CI =& get_instance();