2017-08-07 156 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主題的簡短搜索),它是相當的所以如果你設法解決任何問題,看看你的做法會很有趣。)

相關問題