как проверить модель в Zend проекте - PullRequest
3 голосов
/ 10 мая 2011

Я хочу знать, как тестировать модели в Zend Framework, я уже тестировал контроллер в Zend Project.

мой phpunit.xml:

<phpunit bootstrap="./bootstrap.php"  colors="true">         
    <testsuite>
        <directory>./</directory>       
    </testsuite>
    <filter>
        <whitelist>
            <directory suffix="MyApp.php">../application/</directory>
            <exclude>
                <file>../application/Bootstrap.php</file>
                <file>../application/controllers/ErrorController.php</file>
                <directory suffix=".phtml">../application/</directory>
            </exclude>
        </whitelist>
    </filter>


    <logging>
        <log type="coverage-html" target="./log/report" charset="UTF-8"
            yui="true" highlight="true" lowUpperBound="50" highLowerBound="80"/>
        <log type="testdox-html" target="./log/testdox.html" />
    </logging>         
</phpunit>

файл bootstrap.php находится в той же папке, что и phpunit.xml

<?php
error_reporting(E_ALL);

// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'testing'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    realpath(APPLICATION_PATH . '/../tests'),
    get_include_path(),
)));

require_once 'Zend/Application.php';
require_once './application/controllers/ControllerTestCase.php';

ControllerTestCase.php:

<?php
    require_once 'Zend/Application.php';
    require_once 'Zend/Test/PHPUnit/ControllerTestCase.php';

    class ControllerTestCase 
        extends Zend_Test_PHPUnit_ControllerTestCase 
    {
        protected $application;

        public function setUp() {
            $this->bootstrap = array($this,'appBootstrap');
            parent::setUp();

        }

        public function appBootstrap() {
            $this->application = 
                new Zend_Application(APPLICATION_ENV,
                                     APPLICATION_PATH.'/configs/application.ini');

            $this->application->bootstrap();


        }
    }

Я использовал ControllerTestCase в качестве базы и написал контрольный пример для контроллера, и он работает, но я не знаю, как написать контрольный пример для моделей, контрольный пример для модели должен также расширять ControllerTestCase? или он должен расширять Zend_Test_PHPUnit_Db? И поскольку модель будет подключаться к базе данных, как я могу ее протестировать? кто-нибудь может мне помочь в этом? например у меня есть модель:

<?php class Application_Model_User2 extends Custom_Model_Base {
public function __construct() {
        parent::__construct();
    }

    static function create(array $data) {
        return parent::_create(
                $_table,
                get_class(),
                $data,
                self::$_columns,
                true
        );
    }
}

как это проверить?

1 Ответ

1 голос
/ 11 мая 2011

Они должны расширяться PHPUnit_Framework_TestCase, а не ControllerTestCase.

Вы тестируете Модель как единицу функциональности, а не как контроллер, поэтому Модель является отдельным фрагментом кода, который должен работать отдельно от вашего приложения и его контроллеров.

Вы не тестируете базу данных специально, поэтому вам не нужно расширять Zend_Test_PHPUnit_Db.

Настройка PHPUnit должна быть достаточной для запуска приложения, чтобы Zend и любой автозагрузчик были настроены для загрузки вашей Модели. Затем ваши тестовые классы должны просто тестировать элементы кода модели и ничего больше из вашего приложения.

EDIT

Итак, рассмотрим следующую функцию для проверки в классе Application_Model_User2:

static function find($name, $order=null, $limit=null, $offset=null)
{ 
     return self::_selectAndBind(get_class(), 
                                 self::getDefaultAdapter()
                                 ->select()
                                 ->from($_table)
                                 ->where('name = ?', array($name))
                                 ->order($order)
                                 ->limit($limit, $offset)
                               ); 
}

В вашем тестовом классе, который расширяет PHPUnit_Framework_TestCase, вот how-to и docs и Asset Functions , у вас может быть что-то вроде этого :

require_once 'PHPUnit/Framework.php';

class Application_Model_User2Test extends PHPUnit_Framework_TestCase
{
    public function testFind()
    {
         // Get a result from the function we are testing
         $result = Application_Model_User2::find("foo", "date", 10, 0);

         // Test that there are 10 results
         $this->assertEquals(10, count($result));        
    }

}

Вы также можете использовать такие функции, как assertGreaterThan(), чтобы определить, был ли порядок правильным.

Примечание. Это всего лишь простой пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...