Unit test with Phalcon and PHPUnit

Install package

สร้างไฟล์ composer.json ที่ / จากนั้นใช้คำสั่ง composer install

{
    "require": {
        "phpunit/phpunit": "4.1.2",
        "phalcon/incubator": "dev-master"
    }
}

สร้าง folder ชื่อ tests เอาไว้เก็บ test

app/  
public/  
tests/  
vendor/  

สร้าง Test Helper

สร้างไฟล์ชื่อ TestHelper.php เอาไว้สำหรับ bootstrap ระหว่าง Phalcon กับ PHPUnit

<?php  
use Phalcon\DI,  
    Phalcon\DI\FactoryDefault;

ini_set('display_errors',1);  
error_reporting(E_ALL);

define('ROOT_PATH', __DIR__);  
define('PATH_LIBRARY', __DIR__ . '/../app/library/');  
define('PATH_SERVICES', __DIR__ . '/../app/services/');  
define('PATH_RESOURCES', __DIR__ . '/../app/resources/');

set_include_path(  
    ROOT_PATH . PATH_SEPARATOR . get_include_path()
);

// required for phalcon/incubator
include __DIR__ . "/../vendor/autoload.php";

// use the application autoloader to autoload the classes
// autoload the dependencies found in composer
$loader = new \Phalcon\Loader();

$loader->registerDirs(array(
    ROOT_PATH
));

$loader->registerNamespaces(array(
    'Phalcon' => __DIR__ . '/../vendor/phalcon/incubator/Library/Phalcon/'
));

$loader->register();

$di = new FactoryDefault();
DI::reset();

// add any needed services to the DI here

DI::setDefault($di);  

Config PHPunit.xml

สร้างไฟล์ phpunit.xml เพื่อระบุ TestHelper

<?xml version="1.0" encoding="UTF-8"?>  
<phpunit bootstrap="./TestHelper.php"  
         backupGlobals="false"
         backupStaticAttributes="false"
         verbose="true"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="true">
    <testsuite name="Phalcon - Testsuite">
        <directory>./</directory>
    </testsuite>
</phpunit>  

ลองเขียน Test

สร้างไฟล์ UnitTestCase.php ไว้ใน /tests

<?php  
use Phalcon\DI,  
    \Phalcon\Test\UnitTestCase as PhalconTestCase;

abstract class UnitTestCase extends PhalconTestCase {

    /**
     * @var \Voice\Cache
     */
    protected $_cache;

    /**
     * @var \Phalcon\Config
     */
    protected $_config;

    /**
     * @var bool
     */
    private $_loaded = false;

    public function setUp(Phalcon\DiInterface $di = NULL, Phalcon\Config $config = NULL) {

        // Load any additional services that might be required during testing
        $di = DI::getDefault();

        // get any DI components here. If you have a config, be sure to pass it to the parent
        parent::setUp($di);

        $this->_loaded = true;
    }

    /**
     * Check if the test case is setup properly
     * @throws \PHPUnit_Framework_IncompleteTestError;
     */
    public function __destruct() {
        if(!$this->_loaded) {
            throw new \PHPUnit_Framework_IncompleteTestError('Please run parent::setUp().');
        }
    }
}

เขียน Test

เราจะ test การทำงานของ UnitTest.php ด้วยการสร้างไฟล์ testsTestUnitTest.php

<?php

namespace Test;

/**
 * Class UnitTest
 */
class UnitTest extends \UnitTestCase {

    public function testTestCase() {

        $this->assertEquals('works',
            'works',
            'This is OK'
        );

        $this->assertEquals('works',
            'works1',
            'This wil fail'
        );
    }
}

Test

cd เข้าไปที่ /tests แล้วสั่ง

$ phpunit testsTestUnitTest.php

จะได้ result ออกมาประมาณนี้ เป็นอันว่า PHPUnit กับ Phalcon ใช้งานได้

PHPUnit 4.1.2 by Sebastian Bergmann.

Configuration read from /Users/pangpond/Sites/Phalcon/tutorial1/tests/phpunit.xml

F

Time: 30 ms, Memory: 3.50Mb

There was 1 failure:

1) Test\UnitTest::testTestCase  
This wil fail  
Failed asserting that two strings are equal.  
--- Expected
+++ Actual
@@ @@
-'works'
+'works1'

/Users/pangpond/Sites/Phalcon/tutorial1/tests/testsTestUnitTest.php:22

FAILURES!  
Tests: 1, Assertions: 2, Failures: 1.