最近更新: 2008-03-25

如何替使用 CodeIgniter framework 開發的程式進行 PHPUnit3 的單元測試

先說一下 PHP framework 的事,我個人很想用 Zend Framework 。但我服務的公司的軟體是用 PHP4 開發的,所以主機也是跑 PHP4。由於遲遲不見有更新到 PHP5 的計劃,所以我現階是用 CodeIgniter framework 在寫新功能。

另一方面,我又習慣用 PHPUnit 進行測試工作。為此,我必須要弄一個簡單的測試框架出來,才能以 PHPUnit 去測試我用 CodeIgniter framework 寫的功能單元。

我最主要的測試內容是資料庫的操作部份,所以測試框架中一併載入了 CodeIgniter 的 Database class。

重點

CodeIgniter 必要的三個常數: APPPATH, BASEPATH, EXT

CodeIgniter 的 Database class 使用了2個函數: log_message(), show_error()。我們要定義那2個函數。函數內容很簡單,最簡單的內容就是什麼都不做。

<?php
require_once 'PHPUnit/Framework.php';

define('APPPATH', realpath(dirname(__FILE__)) . '/../src/');
define('BASEPATH', realpath(dirname(__FILE__)) . '/../src/core/');
define('EXT', '.php');

require_once BASEPATH . 'database/DB.php';

define('TESTSUITEPATH', realpath(dirname(__FILE__)) . '/');

/**
 * log_message(), a mock function.
 */ 
function log_message() {
    // nothing
}
function show_error($msg) {
    // nothing
}

class MyWebApp_TestCase extends PHPUnit_Framework_TestCase {
    /**
     * DSN, dbdriver://username:password@hostname/database    
     * @var string 
     */
    protected $DSN = 'postgre://xxx:xxx@localhost/myWebApp';
    
    /**
     * Instance of CI's database class    
     * @var object     
     */
    protected $db;     

    protected function initDB() {
        try {
            $this->db = DB($this->DSN);
        }
        catch (Exception $e) {
            $this->fail('Connect database error!');
        }
    }

}
?>

最後,參考 使用 CodeIgniter 作為開發框架並預期以 GPL 散佈應用軟體的作法 的內容,了解更多細節。

樂多舊網址: http://blog.roodo.com/rocksaying/archives/5751939.html