2017-08-07 116 views
4

我正在codeigniter上运行phpunit测试,我有一段admin_test.php文件与这段代码。无法在codeigniter上运行phpunit测试,CI未找到错误

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}() 

我用作曲家获得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> 
+0

我不确定,但也许类应该扩展CI_Controller? – Deblugger

+0

@Deblugger我正在尝试运行phpunit测试,它无法扩展CI_Controller,那么单元测试将如何运行呢?当然我可以给它一个 – FaF

+0

是的,但如果它不扩展CI_Controller我认为你不能使用Codeigniter函数 – Deblugger

回答

0

我没有对CI非常熟悉,但有机会与使用它的代码库一起工作。事情是function &get_isntance()被定义在system/core/CodeIgniter.php文件中。所以(它似乎)你可以include它能够使用该功能(你可以创建一些特殊的引导文件,这将包括这个文件和vendor/autoload.php)。

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

这留下了一个选择 - 要么检查所有CI bootrstraping代码,并提取所有适合和需要进行单元测试并运行它们的东西。或者放弃对基于CI的代码进行单元测试的想法,尝试一些不太深入和更为综合的方法:例如Codeception提供的测试(或搜索其他类似工具)。

就我个人而言,我认为第一种选择是不值得做出这样的努力的,原因很明显。因此,如果您必须执行CI并想执行一些测试,那么不要潜入其内部并专注于要测试的代码的外部边界会更有成效。 (不能说我已经对基于CI的代码做了真正的单元测试做了全面覆盖和全面的搜索,但似乎(即使只考虑关于这个主题的SO主题的简短搜索),它是相当的所以如果你设法解决任何问题,看看你的做法会很有趣。)

相关问题