tvr/tyii

Help component for testing yii controllers

1.0.3 2014-11-25 18:41 UTC

README

Небольшой инструмент для интеграционного тестирование контроллеров в фреймворке Yii v1.*

Установка

Нормально устанавливается через composer:

"require": {
    "tvr/tyii": "1.*"
}

Настройка

Пример bootstrap.php файла:

<?php
require dirname(__FILE__).'/../vendor/autoload.php';
// change the following paths if necessary
$yiit=dirname(__FILE__).'/../vendor/yiisoft/yii/framework/yiit.php';
$config=dirname(__FILE__).'/../frontend/protected/config/test.php';

$_SERVER["SERVER_NAME"] = "lovething.dev029.devplatform1.com";
$_SERVER['SCRIPT_FILENAME'] = "/home/kovardin/Projects/lovething.dev029.devplatform1.com/www/frontend/index.php";
$_SERVER['SCRIPT_NAME'] = "/index.php";
$_SERVER['HTTP_HOST'] = "http://lovething.dev029.devplatform1.com/";
$_SERVER['QUERY_STRING'] = "";
$_SERVER['REQUEST_URI'] = "/";

require_once($yiit);

Yii::setPathOfAlias('tests', dirname(__FILE__).'/../tests');
Yii::createWebApplication($config);

В конфиг test.php нужно добавить заглушку для CHttpRequest.

<?php

Yii::setPathOfAlias('tvr', __DIR__."/../../vendor/tvr/tyii/src");

$config = CMap::mergeArray(
    require(dirname(__FILE__).'/main.php'),
    array(
        'components'=>array(
            'fixture'=>array(
                'basePath' => __DIR__.'/../../tests/fixtures',
                'class'=>'system.test.CDbFixtureManager',
            ),
            'request' => array(
               "class" => 'tvr.mocks.MockRequest'
            ),
        ),
    )
);

return $config;

Тест

В пакете есть два класса \tvr\tyii\DbTestCase и \tvr\tyii\TestCase, которые используется как замена CDbTestCase и CTestCase соответственно.

Наследуясь от этих классов можно использовать дополнительные методы. Например:

<?php

use tvr\tyii\TestCase;

class CreditsControllersTest extends TestCase
{
    public function testHtmlContains()
    {
        // выполняем запрос
        $result = $this->request("GET", "/index.php/earning-credits");

        // проверяем элементы на странице
        $this->assertHtmlContains("a.twitter-link", $result);

    }

    public function testRedirect()
    {
        // выполняем запрос
        $this->request("POST", "/index.php/login.html", array(
            "application_modules_users_forms_UserSignInForm" => array(
                "email" => "test2@gmail.com",
                "password" => "123"
            )
        ));

        // проверяем, куда нас редиректит
        $this->assertRedirect("/");
    }
}

Если вам нужно проверить страничку, которая доступна только для залогиненных пользователей, существует специальный метод $this->auth($id). В качестве параметра этот метод принимает ID пользователя. Это реализованно простым вызовом Yii::app()->user->setState('__id', $id);. Поэтому, если вам необходимо при авторизации установить дополнительные параметры, то придётся переопределить этот метод.

<?php

use tvr\tyii\DbTestCase;
use common\models\users\UserModel;

class CreditsControllersTest extends DbTestCase
{
    public $fixtures = array(
        "users" => "\\common\\models\\users\\UserModel",
    );

    public function setUp()
    {
        parent::setUp();

        // авторизируем пользователя
        $userId = 1;
        $this->auth($userId);
    }

    public function testCheckWidgetsOnPage()
    {
        // выполняем запрос к защищённой странице
        $result = $this->request("GET", "/index.php/earning-credits");
        $this->assertHtmlContains("a.twitter-link", $result);

    }
}

Обратите внимание, что при работе с методами логина пользователя очень часто необходимо замочить функцию session_regenerate_id()

<?php

$mockSession = $this->getMock('CHttpSession', array('regenerateID'));
\Yii::app()->setComponent('session', $mockSession);