Phalcon框架本身并未集成UnitTest
而原生的PHPUnitTest有些复杂,为了使开发更容易开故移植CI的UnitTest组件,以下是添加此组件的方法。
1.复制如下文本到components(若不存在则自己添加)文件夹下
<?php
namespace components;
/**
* CodeIgniter
* UnitTest.php
* An open source application development framework for PHP 5.1.6 or newer
*
* @package CodeIgniter
* @author ExpressionEngine Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc.
* @license http://codeigniter.com/user_guide/license.html
* @link http://codeigniter.com
* @since Version 1.3.1
* @filesource
*
*/
// ------------------------------------------------------------------------
/**
* Unit Testing Class
*
* Simple testing class
*
* @package CodeIgniter
* @subpackage Libraries
* @category UnitTesting
* @author ExpressionEngine Dev Team
* @link http://codeigniter.com/user_guide/libraries/uri.html
*/
class UnitTest implements PhalconDIInjectionAwareInterface
{
var $active = TRUE;
var $results = array();
var $strict = FALSE;
var $_template = NULL;
var $_template_rows = NULL;
var $_test_items_visible = array();
protected $_arrLangUnitTest = NULL;
protected $_di;
public function __construct()
{
// These are the default items visible when a test is run.
$this->_test_items_visible = array(
'test_name',
'test_datatype',
'res_datatype',
'result',
'file',
'line',
'notes'
);
$this->loadLanguage();
// log_message('debug', "Unit Testing Class Initialized");
}
// --------------------------------------------------------------------
/**
* Run the tests
*
* Runs the supplied tests
*
* @access public
* @param
* array
* @return void
*/
function set_test_items( $items = array() )
{
if( ! empty($items) and is_array($items) ) {
$this->_test_items_visible = $items;
}
}
function loadLanguage()
{
if( ! $this->_arrLangUnitTest ) {
$this->_arrLangUnitTest = include APP_PATH . 'language/unit_test_lang.php';
}
return $this->_arrLangUnitTest;
}
function getLine( $line = '' )
{
$value = ($line == '' or ! isset($this->_arrLangUnitTest[$line])) ? FALSE : $this->_arrLangUnitTest[$line];
return $value;
}
// --------------------------------------------------------------------
/**
* Run the tests
*
* Runs the supplied tests
*
* @access public
* @param
* mixed
* @param
* mixed
* @param
* string
* @return string
*/
function run( $test, $expected = TRUE, $test_name = 'undefined', $notes = '' )
{
if( $this->active == FALSE ) {
return FALSE;
}
if( in_array($expected, array(
'is_object',
'is_string',
'is_bool',
'is_true',
'is_false',
'is_int',
'is_numeric',
'is_float',
'is_double',
'is_array',
'is_null'
), TRUE) ) {
$expected = str_replace('is_float', 'is_double', $expected);
$result = ($expected($test)) ? TRUE : FALSE;
$extype = str_replace(array(
'true',
'false'
), 'bool', str_replace('is_', '', $expected));
}
else {
if( $this->strict == TRUE )
$result = ($test === $expected) ? TRUE : FALSE;
else
$result = ($test == $expected) ? TRUE : FALSE;
$extype = gettype($expected);
}
$back = $this->_backtrace();
$report[] = array(
'test_name' => $test_name,
'test_datatype' => gettype($test),
'res_datatype' => $extype,
'result' => ($result === TRUE) ? 'passed' : 'failed',
'file' => $back['file'],
'line' => $back['line'],
'notes' => $notes
);
$this->results[] = $report;
return ($this->report($this->result($report)));
}
// --------------------------------------------------------------------
/**
* Generate a report
*
* Displays a table with the test data
*
* @access public
* @return string
*/
function report( $result = array() )
{
if( count($result) == 0 ) {
$result = $this->result();
}
$this->_parse_template();
$r = '';
foreach( $result as $res ) {
$table = '';
foreach( $res as $key => $val ) {
if( $key == $this->getLine( 'ut_result' ) ) {
if( $val == $this->getLine( 'ut_passed' ) ) {
$val = '<span style="color: #0C0;">' . $val . '</span>';
}
elseif( $val == $this->getLine( 'ut_failed' ) ) {
$val = '<span style="color: #C00;">' . $val . '</span>';
}
}
$temp = $this->_template_rows;
$temp = str_replace('{item}', $key, $temp);
$temp = str_replace('{result}', $val, $temp);
$table .= $temp;
}
$r .= str_replace('{rows}', $table, $this->_template);
}
return $r;
}
// --------------------------------------------------------------------
/**
* Use strict comparison
*
* Causes the evaluation to use === rather than ==
*
* @access public
* @param
* bool
* @return null
*/
function use_strict( $state = TRUE )
{
$this->strict = ($state == FALSE) ? FALSE : TRUE;
}
// --------------------------------------------------------------------
/**
* Make Unit testing active
*
* Enables/disables unit testing
*
* @access public
* @param
* bool
* @return null
*/
function active( $state = TRUE )
{
$this->active = ($state == FALSE) ? FALSE : TRUE;
}
// --------------------------------------------------------------------
/**
* Result Array
*
* Returns the raw result data
*
* @access public
* @return array
*/
function result( $results = array() )
{
// $CI =& get_instance();
// $CI->load->language('unit_test');
if( count($results) == 0 ) {
$results = $this->results;
}
$retval = array();
foreach( $results as $result ) {
$temp = array();
foreach( $result as $key => $val ) {
if( ! in_array($key, $this->_test_items_visible) ) {
continue;
}
if( is_array($val) ) {
foreach( $val as $k => $v ) {
if( FALSE !== ($line = $this->getLine( strtolower('ut_' . $v) )) ) {
$v = $line;
}
$temp[$this->getLine( 'ut_' . $k )] = $v;
}
}
else {
if( FALSE !== ($line = $this->getLine( strtolower('ut_' . $val))) ) {
$val = $line;
}
$temp[$this->getLine( 'ut_' . $key )] = $val;
}
}
$retval[] = $temp;
}
return $retval;
}
// --------------------------------------------------------------------
/**
* Set the template
*
* This lets us set the template to be used to display results
*
* @access public
* @param
* string
* @return void
*/
function set_template( $template )
{
$this->_template = $template;
}
// --------------------------------------------------------------------
/**
* Generate a backtrace
*
* This lets us show file names and line numbers
*
* @access private
* @return array
*/
function _backtrace()
{
if( function_exists('debug_backtrace') ) {
$back = debug_backtrace();
$file = (! isset($back['1']['file'])) ? '' : $back['1']['file'];
$line = (! isset($back['1']['line'])) ? '' : $back['1']['line'];
return array(
'file' => $file,
'line' => $line
);
}
return array(
'file' => 'Unknown',
'line' => 'Unknown'
);
}
// --------------------------------------------------------------------
/**
* Get Default Template
*
* @access private
* @return string
*/
function _default_template()
{
$this->_template = "
" . '<table style="width:100%; font-size:small; margin:10px 0; border-collapse:collapse; border:1px solid #CCC;">';
$this->_template .= '{rows}';
$this->_template .= "
" . '</table>';
$this->_template_rows = "
" . '<tr>';
$this->_template_rows .= "
" . '<th style="text-align: left; border-bottom:1px solid #CCC;">{item}</th>';
$this->_template_rows .= "
" . '<td style="border-bottom:1px solid #CCC;">{result}</td>';
$this->_template_rows .= "
" . '</tr>';
}
// --------------------------------------------------------------------
/**
* Parse Template
*
* Harvests the data within the template {pseudo-variables}
*
* @access private
* @return void
*/
function _parse_template()
{
if( ! is_null($this->_template_rows) ) {
return;
}
if( is_null($this->_template) ) {
$this->_default_template();
return;
}
if( ! preg_match("/{rows}(.*?){/rows}/si", $this->_template, $match) ) {
$this->_default_template();
return;
}
$this->_template_rows = $match['1'];
$this->_template = str_replace($match['0'], '{rows}', $this->_template);
}
/*
* (non-PHPdoc) @see PhalconDIInjectionAwareInterface::setDI()
*/
public function setDI( $dependencyInjector )
{
$this->_di = $dependencyInjector;
}
/*
* (non-PHPdoc) @see PhalconDIInjectionAwareInterface::getDI()
*/
public function getDI()
{
return $this->_di;
}
}
// END Unit_test Class
/**
* Helper functions to test boolean true/false
*
*
* @access private
* @return bool
*/
function is_true( $test )
{
return (is_bool($test) and $test === TRUE) ? TRUE : FALSE;
}
function is_false( $test )
{
return (is_bool($test) and $test === FALSE) ? TRUE : FALSE;
}
/* End of file Unit_test.php */
/* Location: ./system/libraries/Unit_test.php */
添加如下文件到app/language文件夹下:
<?php
$langUnitTest['ut_test_name'] = 'Test Name';
$langUnitTest['ut_test_datatype'] = 'Test Datatype';
$langUnitTest['ut_res_datatype'] = 'Expected Datatype';
$langUnitTest['ut_result'] = 'Result';
$langUnitTest['ut_undefined'] = 'Undefined Test Name';
$langUnitTest['ut_file'] = 'File Name';
$langUnitTest['ut_line'] = 'Line Number';
$langUnitTest['ut_passed'] = 'Passed';
$langUnitTest['ut_failed'] = 'Failed';
$langUnitTest['ut_boolean'] = 'Boolean';
$langUnitTest['ut_integer'] = 'Integer';
$langUnitTest['ut_float'] = 'Float';
$langUnitTest['ut_double'] = 'Float'; // can be the same as float
$langUnitTest['ut_string'] = 'String';
$langUnitTest['ut_array'] = 'Array';
$langUnitTest['ut_object'] = 'Object';
$langUnitTest['ut_resource'] = 'Resource';
$langUnitTest['ut_null'] = 'Null';
$langUnitTest['ut_notes'] = 'Notes';
return $langUnitTest;
/* End of file unit_test_lang.php */
/* Location: ./system/language/english/unit_test_lang.php */
3.注册命名空间conponents => APP_PATH . 'components/';
4.测试一下是否正确
<?php
//UTestController.php
namespace controllers;
class UTestController extends PhalconMvcController
{
public function indexAction()
{
echo $this->utest->run('abc', 'abc');
echo $this->utest->run('1+1', '2');
}
}
?>
OK成功
这个样我们在Phalcon即可很简易的使用UnitTest了