Spec-Zone.ru › Yii 1.1

CDbFixtureManager

Пакет system.test
Наследование класс CDbFixtureManager » CApplicationComponent » CComponent
Реализует IApplicationComponent
С момента 1.1
Исходный код framework/test/CDbFixtureManager.php
CDbFixtureManager управляет фикстурами базы данных во время тестирования.

Фикстура представляет собой список строк для определённой таблицы. При использовании фикстуры в методе тестирования, таблица в начале метода содержит только те строки, которые заданы в фикстуре. Таким образом, состояние таблицы предсказуемо.

Фикстура представлена как PHP-скрипт, имя которого (без суффикса) совпадает с именем таблицы (если необходимо имя схемы, оно должно быть префикса к имени таблицы). PHP-скрипт возвращает массив, представляющий список строк таблицы. Каждая строка — ассоциативный массив значений столбцов, индексированных именами столбцов.

Фикстура может быть связана со скриптом инициализации, который находится в той же директории фикстуры и называется "TableName.init.php". Скрипт инициализации используется для инициализации таблицы перед заполнением данных фикстуры в таблицу. Если скрипт инициализации не существует, таблица будет очищена.

Фикстуры должны храниться в директории basePath. Директория может содержать файл с именем "init.php", который будет выполнен один раз для инициализации базы данных. Если этот файл не найден, все доступные фикстуры будут загружены в базу данных.

Свойства public

Свойство Тип Описание Определено
basePath строка базовый путь, содержащий все фикстуры. CDbFixtureManager
behaviors массив поведения, которые должны быть присоединены к этому компоненту. CApplicationComponent
connectionID строка идентификатор подключения к базе данных. CDbFixtureManager
dbConnection CDbConnection Возвращает подключение к базе данных, используемое для загрузки фикстур. CDbFixtureManager
fixtures массив возвращает информацию о доступных фикстурах. CDbFixtureManager
initScript строка имя скрипта инициализации, который будет выполнен перед запуском всего набора тестов. CDbFixtureManager
initScriptSuffix строка суффикс для скриптов инициализации фикстур. CDbFixtureManager
isInitialized boolean Проверяет, был ли инициализирован этот компонент приложения. CApplicationComponent
schemas массив список схем базы данных, в которых могут находиться тестовые таблицы. CDbFixtureManager

Публичные методы

Метод Описание Определено в
__call() Вызывает именованный метод, который не является методом класса. CComponent
__get() Возвращает значение свойства, список обработчиков событий или поведение на основе его имени. CComponent
__isset() Проверяет, является ли значение свойства null. CComponent
__set() Устанавливает значение свойства компонента. CComponent
__unset() Устанавливает свойство компонента в значение null. CComponent
asa() Возвращает объект поведения с заданным именем. CComponent
attachBehavior() Прикрепляет поведение к этому компоненту. CComponent
attachBehaviors() Прикрепляет список поведений к компоненту. CComponent
attachEventHandler() Прикрепляет обработчик событий к событию. CComponent
canGetProperty() Определяет, можно ли прочитать свойство. CComponent
canSetProperty() Определяет, можно ли установить свойство. CComponent
checkIntegrity() Включает или отключает проверку целостности базы данных. CDbFixtureManager
detachBehavior() Отсоединяет поведение от компонента. CComponent
detachBehaviors() Отсоединяет все поведения от компонента. CComponent
detachEventHandler() Отсоединяет существующий обработчик событий. CComponent
disableBehavior() Отключает прикрепленное поведение. CComponent
disableBehaviors() Отключает все прикрепленные к этому компоненту поведения. CComponent
enableBehavior() Включает прикрепленное поведение. CComponent
enableBehaviors() Включает все прикрепленные к этому компоненту поведения. CComponent
evaluateExpression() Вычисляет выражение PHP или обратный вызов в контексте этого компонента. CComponent
getDbConnection() Возвращает соединение с базой данных, используемое для загрузки фикстур. CDbFixtureManager
getEventHandlers() Возвращает список прикрепленных обработчиков событий для события. CComponent
getFixtures() Возвращает информацию о доступных фикстурах. CDbFixtureManager
getIsInitialized() Проверяет, был ли инициализирован этот компонент приложения. CApplicationComponent
getRecord() Возвращает указанный экземпляр ActiveRecord в данных фикстуры. CDbFixtureManager
getRows() Возвращает строки данных фикстуры. CDbFixtureManager
hasEvent() Определяет, определено ли событие. CComponent
hasEventHandler() Проверяет, есть ли прикрепленные обработчики для заданного события. CComponent
hasProperty() Определяет, определено ли свойство. CComponent
init() Инициализирует этот компонент приложения. CDbFixtureManager
load() Загружает указанные фикстуры. CDbFixtureManager
loadFixture() Загружает фикстуру для указанной таблицы. CDbFixtureManager
prepare() Подготавливает фикстуры для всего теста. CDbFixtureManager
raiseEvent() Вызывает событие. CComponent
resetTable() Сбрасывает таблицу до состояния, когда она не содержит данных фикстуры. CDbFixtureManager
truncateTable() Удаляет все строки из указанной таблицы и сбрасывает последовательность первичного ключа, если она есть. CDbFixtureManager
truncateTables() Обнуляет все таблицы в указанной схеме. CDbFixtureManager

Подробное описание свойств

basePath свойство

public string $basePath;

базовый путь, содержащий все фикстуры. По умолчанию равен null, что означает путь 'protected/tests/fixtures'.

connectionID свойство

public string $connectionID;

Идентификатор соединения с базой данных. По умолчанию 'db'. Обратите внимание, что данные в этой базе данных могут быть удалены или изменены во время тестирования. Убедитесь, что у вас есть резервная копия базы данных.

dbConnection свойство только для чтения

public CDbConnection getDbConnection()

Возвращает соединение с базой данных, используемое для загрузки фикстур.

fixtures свойство только для чтения

public array getFixtures()

Возвращает информацию о доступных фикстурах. Этот метод будет искать все PHP-файлы в basePath. Если имя файла совпадает с именем таблицы, оно считается данными фикстуры для этой таблицы.

initScript свойство

public string $initScript;

имя скрипта инициализации, который будет выполнен перед запуском всего набора тестов. По умолчанию 'init.php'. Если скрипт не существует, каждая таблица с файлом фикстуры будет сброшена.

initScriptSuffix свойство

public string $initScriptSuffix;

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

schemas свойство

public array $schemas;

список схем базы данных, в которых могут находиться таблицы тестов. По умолчанию массив(''), использующий стандартную схему (пустая строка относится к стандартной схеме). Это свойство в основном используется при включении и выключении проверок целостности, чтобы данные фикстур можно было заполнить в базу данных без проблем.

Подробное описание методов

checkIntegrity() метод

public void checkIntegrity(boolean $check)
$check boolean включать или выключать проверку целостности базы данных
Исходный код: framework/test/CDbFixtureManager.php#232 (показать)
public function checkIntegrity($check)
{
    foreach(
$this->schemas as $schema)
        
$this->getDbConnection()->getSchema()->checkIntegrity($check,$schema);
}

Включает или отключает проверку целостности базы данных. Этот метод можно использовать для временного отключения проверки внешних ключей.

getDbConnection() метод

public CDbConnection getDbConnection()
{return} CDbConnection соединение с базой данных
Исходный код: framework/test/CDbFixtureManager.php#95 (показать)
public function getDbConnection()
{
    if(
$this->_db===null)
    {
        
$this->_db=Yii::app()->getComponent($this->connectionID);
        if(!
$this->_db instanceof CDbConnection)
            throw new 
CException(Yii::t('yii','CDbTestFixture.connectionID "{id}" is invalid. Please make sure it refers to the ID of a CDbConnection application component.',
                array(
'{id}'=>$this->connectionID)));
    }
    return 
$this->_db;
}

Возвращает соединение с базой данных, используемое для загрузки фикстур.

getFixtures() метод

public array getFixtures()
{return} массив информация о доступных фикстурах (имя таблицы => файл фикстуры)
Исходный код: framework/test/CDbFixtureManager.php#202 (показать)
public function getFixtures()
{
    if(
$this->_fixtures===null)
    {
        
$this->_fixtures=array();
        
$schema=$this->getDbConnection()->getSchema();
        
$folder=opendir($this->basePath);
        
$suffixLen=strlen($this->initScriptSuffix);
        while(
$file=readdir($folder))
        {
            if(
$file==='.' || $file==='..' || $file===$this->initScript)
                continue;
            
$path=$this->basePath.DIRECTORY_SEPARATOR.$file;
            if(
substr($file,-4)==='.php' && is_file($path) && substr($file,-$suffixLen)!==$this->initScriptSuffix)
            {
                
$tableName=substr($file,0,-4);
                if(
$schema->getTable($tableName)!==null)
                    
$this->_fixtures[$tableName]=$path;
            }
        }
        
closedir($folder);
    }
    return 
$this->_fixtures;
}

Возвращает информацию о доступных фикстурах. Этот метод будет искать все PHP-файлы в каталоге basePath. Если имя файла совпадает с именем таблицы, оно считается данными фикстуры для этой таблицы.

getRecord() метод

public CActiveRecord getRecord(string $name, string $alias)
$name строка имя фикстуры
$alias строка псевдоним для строки данных фикстуры
{return} CActiveRecord экземпляр ActiveRecord. Возвращает False, если такой строки данных фикстуры нет.
Исходный код: framework/test/CDbFixtureManager.php#342 (показать)
public function getRecord($name,$alias)
{
    if(isset(
$this->_records[$name][$alias]))
    {
        if(
is_string($this->_records[$name][$alias]))
        {
            
$row=$this->_rows[$name][$alias];
            
$model=CActiveRecord::model($this->_records[$name][$alias]);
            
$key=$model->getTableSchema()->primaryKey;
            if(
is_string($key))
                
$pk=$row[$key];
            else
            {
                foreach(
$key as $k)
                    
$pk[$k]=$row[$k];
            }
            
$this->_records[$name][$alias]=$model->findByPk($pk);
        }
        return 
$this->_records[$name][$alias];
    }
    else
        return 
false;
}

Возвращает указанный экземпляр ActiveRecord в данных фикстуры.

getRows() метод

public array getRows(string $name)
$name строка имя фикстуры
{return} массив строки данных фикстуры. Возвращает False, если таких данных нет.
Исходный код: framework/test/CDbFixtureManager.php#328 (показать)
public function getRows($name)
{
    if(isset(
$this->_rows[$name]))
        return 
$this->_rows[$name];
    else
        return 
false;
}

Возвращает строки данных фикстуры. Строки будут иметь обновлённые значения первичного ключа, если первичный ключ автоинкрементный.

init() метод

public void init()
Исходный код: framework/test/CDbFixtureManager.php#82 (показать)
public function init()
{
    
parent::init();
    if(
$this->basePath===null)
        
$this->basePath=Yii::getPathOfAlias('application.tests.fixtures');
    
$this->prepare();
}

Инициализирует компонент приложения.

load() метод

public void load(array $fixtures)
$fixtures массив фикстуры для загрузки. Ключи массива — имена фикстур, значения — имена классов AR или имена таблиц. Если имена таблиц, они должны начинаться с двоеточия (например, 'Post' — имя класса AR, а ':Post' — имя таблицы).
Исходный код: framework/test/CDbFixtureManager.php#285 (показать)
public function load($fixtures)
{
    
$schema=$this->getDbConnection()->getSchema();
    
$schema->checkIntegrity(false);

    
$this->_rows=array();
    
$this->_records=array();
    foreach(
$fixtures as $fixtureName=>$tableName)
    {
        if(
$tableName[0]===':')
        {
            
$tableName=substr($tableName,1);
            unset(
$modelClass);
        }
        else
        {
            
$modelClass=Yii::import($tableName,true);
            
$tableName=CActiveRecord::model($modelClass)->tableName();
        }
        if((
$prefix=$this->getDbConnection()->tablePrefix)!==null)
            
$tableName=preg_replace('/{{(.*?)}}/',$prefix.'\1',$tableName);
        
$this->resetTable($tableName);
        
$rows=$this->loadFixture($tableName);
        if(
is_array($rows) && is_string($fixtureName))
        {
            
$this->_rows[$fixtureName]=$rows;
            if(isset(
$modelClass))
            {
                foreach(
array_keys($rows) as $alias)
                    
$this->_records[$fixtureName][$alias]=$modelClass;
            }
        }
    }

    
$schema->checkIntegrity(true);
}

Загружает указанные фикстуры. Для каждой фикстуры соответствующая таблица сначала будет сброшена с помощью вызова resetTable, а затем заполнится данными фикстуры. Загруженные данные фикстуры могут быть позже получены с помощью getRows и getRecord. Обратите внимание, что если таблица не имеет данных фикстуры, resetTable всё равно будет вызван для сброса таблицы.

loadFixture() метод

public array loadFixture(string $tableName)
$tableName строка имя таблицы
{return} массив загруженные строки фикстуры, индексированные псевдонимами строк (если есть). Возвращает False, если таблица не содержит фикстуры.
Исходный код: framework/test/CDbFixtureManager.php#160 (показать)
public function loadFixture($tableName)
{
    
$fileName=$this->basePath.DIRECTORY_SEPARATOR.$tableName.'.php';
    if(!
is_file($fileName))
        return 
false;

    
$rows=array();
    
$schema=$this->getDbConnection()->getSchema();
    
$builder=$schema->getCommandBuilder();
    
$table=$schema->getTable($tableName);

    foreach(require(
$fileName) as $alias=>$row)
    {
        
$builder->createInsertCommand($table,$row)->execute();
        
$primaryKey=$table->primaryKey;
        if(
$table->sequenceName!==null)
        {
            if(
is_string($primaryKey) && !isset($row[$primaryKey]))
                
$row[$primaryKey]=$builder->getLastInsertID($table);
            elseif(
is_array($primaryKey))
            {
                foreach(
$primaryKey as $pk)
                {
                    if(!isset(
$row[$pk]))
                    {
                        
$row[$pk]=$builder->getLastInsertID($table);
                        break;
                    }
                }
            }
        }
        
$rows[$alias]=$row;
    }
    return 
$rows;
}

Загружает фикстуру для указанной таблицы. Этот метод вставит строки из фикстуры в соответствующую таблицу. Загруженные строки будут возвращены этим методом. Если таблица имеет автоинкрементный первичный ключ, каждая строка будет содержать обновлённое значение первичного ключа. Если фикстура не существует, этот метод вернёт false. Обратите внимание, что перед вызовом этого метода вы можете вызвать resetTable, чтобы таблица была предварительно очищена.

prepare() метод

public void prepare()
Исходный код: framework/test/CDbFixtureManager.php#112 (показать)
public function prepare()
{
    
$initFile=$this->basePath . DIRECTORY_SEPARATOR . $this->initScript;

    
$this->checkIntegrity(false);

    if(
is_file($initFile))
        require(
$initFile);
    else
    {
        foreach(
$this->getFixtures() as $tableName=>$fixturePath)
        {
            
$this->resetTable($tableName);
            
$this->loadFixture($tableName);
        }
    }
    
$this->checkIntegrity(true);
}

Подготавливает фикстуры для всего теста. Этот метод вызывается в init. Он выполняет скрипт инициализации базы данных, если он существует. В противном случае он загрузит все доступные фикстуры.

resetTable() метод

public void resetTable(string $tableName)
$tableName строка имя таблицы
Исходный код: framework/test/CDbFixtureManager.php#139 (показать)
public function resetTable($tableName)
{
    
$initFile=$this->basePath . DIRECTORY_SEPARATOR . $tableName . $this->initScriptSuffix;
    if(
is_file($initFile))
        require(
$initFile);
    else
        
$this->truncateTable($tableName);
}

Сбрасывает состояние таблицы до состояния, когда она не содержит данных фикстуры. Если существует скрипт инициализации с именем "tests/fixtures/TableName.init.php", он будет выполнен. В противном случае, truncateTable будет вызван для удаления всех строк из таблицы и сброса последовательности первичного ключа, если таковая есть.

truncateTable() метод

public void truncateTable(string $tableName)
$tableName строка имя таблицы
Исходный код: framework/test/CDbFixtureManager.php#245 (показать)
public function truncateTable($tableName)
{
    
$db=$this->getDbConnection();
    
$schema=$db->getSchema();
    if((
$table=$schema->getTable($tableName))!==null)
    {
        
$db->createCommand('DELETE FROM '.$table->rawName)->execute();
        
$schema->resetSequence($table,1);
    }
    else
        throw new 
CException("Table '$tableName' does not exist.");
}

Удаляет все строки из указанной таблицы и сбрасывает её последовательность первичного ключа, если таковая есть. Возможно, вам потребуется вызвать checkIntegrity, чтобы временно отключить проверку целостности, прежде чем вызывать этот метод.

truncateTables() метод

public void truncateTables(string $schema='')
$schema строка имя схемы. По умолчанию пустая строка, что означает схему базы данных по умолчанию.
Исходный код: framework/test/CDbFixtureManager.php#265 (показать)
public function truncateTables($schema='')
{
    
$tableNames=$this->getDbConnection()->getSchema()->getTableNames($schema);
    foreach(
$tableNames as $tableName)
        
$this->truncateTable($tableName);
}

Удаляет все таблицы в указанной схеме. Возможно, вам потребуется вызвать checkIntegrity, чтобы временно отключить проверку целостности, прежде чем вызывать этот метод.

См. также

  • truncateTable

© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc/api/1.1/CDbFixtureManager

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API