Yii測試沒找到PHPUnit_Extensions_Database_TestCase?(已解決)

我在yii2.0里自動生成的protected/tests/unit下建立了UserController_Test.php,

代碼見下:

&userController = new UserController_Mock(); //測試替身
}

public function testCreate() {
//step 1. 構建
$fields = array(
"face_url" =&> "",
"nick_name" =&> "tongtong",
"real_name" =&> "鄧禮桐",
"phone" =&> "15622753418",
"password" =&> "root",
"department_id" =&> 1,
"school_id" =&> 1,
);
$this-&>userController-&>setAttributes($fields);

//step 2. 執行
$result = $this-&>userController-&>actionCreate();
//step 3. 驗證
print_r($result);
}
}

class UserController_Mock extends UserController {

public function setAttributes($array) {
$this-&>object = (object)$array;
}
}
在目錄 /protected/tests/ 下在終端運行
phpunit --bootstrap bootstrap.php unit/UserController_Test.php
提示PHP Warning: include(PHPUnit_Extensions_Database_TestCase.php):
failed to open stream: No such file or directory in
/var/www/html/weidouapp/framework/YiiBase.php on line 448
這個錯誤怎麼解決啊?謝謝各位的熱心解答~


終於解決了Yii2.0單元測試這個棘手的問題!下面是我的一些解決過程,和大家一起學習了(想要看簡要解決步驟的直接看第9點)。

  1. 考慮到和團隊其他成員的協作,一開始我是打算在Windows下裝phpunit的,下載go-pear.phar裝好pear後在命令行下添加包老是出錯,最後裝上了phpunit,但跑起來的時候還是出錯,經過幾番折騰裝了幾次仍然失敗之後,決定放棄windows轉到Ubuntu下開發。
  2. 在Ubuntu下裝phpunit只需要在終端輸入sudo apt-get install phpunit就可以裝好了,Yii框架使用了selenium來測試所以還需要安裝selenium,sudo apt-get install phpunit-selenium; 裝好後然後就去protected/tests/unit下寫單元測試,然後在終端的時候出現了PHPUnit_Extensions_Database_TestCase.php not found這個錯誤,百度Google一番好像是需要先安裝phpunit/DbUnit,於是我去裝phpunit/DbUnit,用pear安裝phpunit/DbUnit的時候總是提示no release found,或者是http://pear.phpunit.de/dbunit not found,找不到安裝包,於是我懷疑我的Ubuntukylin14.04 LTS的源是不是沒有更新到最新,於是先去修改源,然而結果還是一樣,所以,繼續Google,,(困擾了幾天了,然而項目在那裡,客戶要求要有單元測試報告,如果這個解決不了後面的推進不了。。。)
  3. 於是我沉住氣繼續Google,發現了一個鏈接phpunit/dbunit,上面寫的是安裝dbunit用的是這一句 composer require phpunit/dbunit,於是我又得先安裝composer,好了,安裝composer用這兩句搞定

    curl -sS https://getcomposer.org/installer | php

    mv composer.phar /usr/local/bin/composer,是全局安裝。安裝好之後接著安裝了phpunit/dbunit,這次安裝很順利,以為就要成功了,然而安裝之後phpunit單元測試仍然報錯找不到PHPUnit_Extension_Database_TestCase.php,(真是百思不得姐啊)。。
  4. 還是上面那個鏈接phpunit/dbunit,發現了博主github!於是點進去,看到博主github上面的這個dbunit代碼包sebastianbergmann/dbunit · GitHub,結合前面的報錯加上過程中Google看到有些例子的寫法是

    require "/Extensions/Database/TestCase.php";

    class abcTest extends PHPUnit_Extensions_Database_TestCase {

    }

    於是想到可能在PHPUnit下面在Extensions里有Database這個模塊就可以了?(sudo apt-get install phpunit安裝的PHPUnit的Extensions目錄下是沒有Database這個擴展包的),於是我懷著試一試的心態下載了下來,然後拷貝到/usr/share/php/PHPUnit/Extensions目錄下,再去項目protected/tests目錄下運行 phpunit unit/UserController_Test.php,這一次之前的錯誤PHPUnit_Extension_Database_TestCase.php not found 解決了,然而又出現了一個新的bug...PHPUnit_Extension_Database_TestCaseTrait not found,於是我再次沉住氣,打開了/Extension/Database的目錄看代碼(其實此刻我的心情是呵呵噠的。。。),打開TestCase.php,TestCaseTrait.php,在TestCase.php 有一句 use PHPUnit_Extensions_TestCaseTrait,應該就是在這一句報的錯,於是再去打開Autoload.php,裡面有一個從類名到文件名的映射數組,找到了 "phpunit_extensions_database_testcase" =&> "/Extensions/Database/TestCase.php"這一句,唯獨就是沒有"phpunit_extensions_database_testcase_trait" =&> "/Extensions/Database/TestCaseTrait.php"這一句,我在Autoload.php添加了這一句之後再去測試phpunit unit/UserController_Test.php,之前的報錯都消失了!好開心,終於快要看到勝利的曙光了!
  5. 然而,還有新的bug了。。。在UserController_Test.php裡面初始化UserController之後,在調用一人成員函數的時候就會報錯:Create object from empty object。。。於是我又去看框架的CController,Controller,定位到 public __construct($id,$module = null),應該是在Tests目錄下初始化controller的時候沒有像protected目錄下那樣自動生成一個controller流水號,於是我改寫一個繼承了CController的Controller的構造函數

    public __construct() {

    parent::__construct(uniqid());

    }

    再去終端測試,然後成功了!
  6. 下面是一些截圖:

    這裡貼一下測試覆蓋率的報告圖片(綠色為測試覆蓋到的代碼,紅色的代表沒有覆蓋到):

  7. 解決了問題,好開心!雖然被它困擾了好幾天了,謝謝作者Sebastian Bergmann,他的github主頁是sebastianbergmann (Sebastian Bergmann) · GitHub
  8. 8:50上課,然而我還在宿舍碼這份總結回答,我要去上軟體工程課了。。。

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  9. 總結簡要解決步驟:

    1. 在Ubuntu下用sudo apt-get install phpunit安裝好phpunit,接著安裝selenium: sudo apt-get install phpunit-selenium;

    2. 下載上面github中的dbunit(sebastianbergmann/dbunit · GitHub)代碼包(或者denglitong/dbunit · GitHub),將src/Extensions下面的Database目錄拷貝到phpunit安裝目錄中的/usr/share/php/PHPUnit/Extensions下,記得修改/Database/Autoload.php增加一行:

    "phpunit_extensions_database_testcase_trait" =&> "/Extensions/Database/TestCaseTrait.php" ;

    3. 在yii框架中的protected/tests/unit中寫單元測試controller類的時候記得要重寫構造函數:

    public __construct() { parent::__construct(uniqid()); } ;

    4. 在項目代碼的protected/tests目錄下在終端執行phpunit unit/UserController_Test.php,即可正常執行單元測試 ;


對照composer/autoload_static.php,

"PHPUnit\Framework\TestCase" =&> __DIR__ . "/.." . "/phpunit/phpunit/src/Framework/TestCase.php",

新版本改成了use "PHPUnitFrameworkTestCase"


強.好詳細啊.


推薦閱讀:

如何開發 PHP 擴展?PHP 擴展應該注意些什麼?
PHP如何模擬登錄學校個人門戶?
新人剛接觸 PHP,哪種框架比較容易上手?
PHP 的哪個 MVC 框架值得推薦?
YII 框架的優點有哪些?

TAG:PHP | PHP框架 | Yii | 單元測試 |