CDbFixtureManager
| Пакет | system.test |
|---|---|
| Наследование | класс CDbFixtureManager » CApplicationComponent » CComponent |
| Реализует | IApplicationComponent |
| С момента | 1.1 |
| Исходный код | framework/test/CDbFixtureManager.php |
Фикстура представляет собой список строк для определённой таблицы. При использовании фикстуры в методе тестирования, таблица в начале метода содержит только те строки, которые заданы в фикстуре. Таким образом, состояние таблицы предсказуемо.
Фикстура представлена как 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 | включать или выключать проверку целостности базы данных |
public function checkIntegrity($check)
{
foreach($this->schemas as $schema)
$this->getDbConnection()->getSchema()->checkIntegrity($check,$schema);
}
Включает или отключает проверку целостности базы данных. Этот метод можно использовать для временного отключения проверки внешних ключей.
getDbConnection() метод
public CDbConnection getDbConnection() | ||
| {return} | CDbConnection | соединение с базой данных |
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} | массив | информация о доступных фикстурах (имя таблицы => файл фикстуры) |
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, если такой строки данных фикстуры нет. |
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, если таких данных нет. |
public function getRows($name)
{
if(isset($this->_rows[$name]))
return $this->_rows[$name];
else
return false;
}
Возвращает строки данных фикстуры. Строки будут иметь обновлённые значения первичного ключа, если первичный ключ автоинкрементный.
init() метод
public void init() |
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' — имя таблицы). |
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, если таблица не содержит фикстуры. |
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() |
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 | строка | имя таблицы |
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 | строка | имя таблицы |
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 | строка | имя схемы. По умолчанию пустая строка, что означает схему базы данных по умолчанию. |
public function truncateTables($schema='')
{
$tableNames=$this->getDbConnection()->getSchema()->getTableNames($schema);
foreach($tableNames as $tableName)
$this->truncateTable($tableName);
}
Удаляет все таблицы в указанной схеме. Возможно, вам потребуется вызвать checkIntegrity, чтобы временно отключить проверку целостности, прежде чем вызывать этот метод.
См. также
© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc/api/1.1/CDbFixtureManager