Home PageКаталог Изменения НовыеКомментарии Пользователи Регистрация
CakePHP: Manual/CommonTasks/Testing/PreparingTestData ...
Это старая версия Manual/CommonTasks/Testing/PreparingTestData за 2009-04-28 12:47:44..

Подготовка тестовых данных

О прикриплениях


Когда тестируете код, который зависит от моделей и данных, можно использовать прикрепления, как способ генерировать временные таблицы, заполненные данными для тестирования. Преимущество использования прикреплений – это то, что ваш тест не сможет разрушить реальные данные. Также, вы можете начать тестировать ваш код непосредственно до разработки реального содержимого для приложения.


CakePHP попытается использовать соединение с именем $test в конфигурационном файле app/config/database.php. Если это соединение не получится использовать, то будет использоваться $default конфигурация и в этой базе данных будут создаваться тестовые таблицы. В обоих случаях, к имени таблиц будет добавляться префикс “test_suite_", для предотвращения конфликтов с, возможно, уже существующими таблицами.


CakePHP выполняет следующие действия во время теста, основанного на прикреплениях:


1. Создает необходимые таблицы для прикрепления
2. Заполняет таблицы данными, если эти данные представлены в прикреплении
3. Выполняет методы теста
4. Очищает таблицы прикрепления
5. Удаляет таблицы прикрепления из базы данных


Создание прикреплений


При создании прикрепления, в основном, вам надо определить две вещи: структуру таблицы (какие поля будут входить в неё), и какие записи будут изначально записаны в эту тестовую таблицу. Давайте создадим наше первое прикрипление, которое будет использоваться для тестирования нашей модели Article. В каталоге app/tests/fixtures создадим файл article_fixture.php со следующим содержимым:


<?php  
 
class ArticleFixture extends CakeTestFixture 
      var 
$name 'Article'
       
      var 
$fields = array( 
          
'id' => array('type' => 'integer''key' => 'primary'), 
          
'title' => array('type' => 'string''length' => 255'null' => false), 
          
'body' => 'text'
          
'published' => array('type' => 'integer''default' => '0''null' => false), 
          
'created' => 'datetime'
          
'updated' => 'datetime' 
      
); 
      var 
$records = array( 
          array (
'id' => 1'title' => 'Первая статья''body' => 'Содержимое первой статьи''published' => '1''created' => '2007-03-18 10:39:23''updated' => '2007-03-18 10:41:31'), 
          array (
'id' => 2'title' => 'Вторая статья''body' => 'Содержимое второй статьи''published' => '1''created' => '2007-03-18 10:41:23''updated' => '2007-03-18 10:43:31'), 
          array (
'id' => 3'title' => 'Третья статья''body' => 'Содержимое третьей статьи''published' => '1''created' => '2007-03-18 10:43:23''updated' => '2007-03-18 10:45:31'
      ); 
 } 
 
?>


Мы используем $fields для определения того, какие поля будет содержать таблица. Формат, используемый для определения этих полей, такой же, который используется в функции generateColumnSchema(), определенной в классах движка баз данных CakePHP (например, в файле dbo_mysql.php.) Давайте посмотрим какие атрибуты может иметь поле и их значение:


type

внутренний тип данных CakePHP. Сейчас поддерживаются: string (соответствует VARCHAR), text (соответствует TEXT), integer (соответствует to INT), float (соответствует to FLOAT), datetime (соответствует DATETIME), timestamp (соответствует TIMESTAMP), time (соответствует TIME), date (соответствует DATE), и binary (соответствует BLOB)

key

установите в 'primary', чтобы поле было AUTO_INCREMENT и PRIMARY KEY для таблицы.

length

присваивайте определенную длину, которую должно иметь поле.

null

устанавливайте в true (для разрешения значений NULL) или false (для запрещения значений NULL)

default

значение по умолчанию, которое принимает поле.

И наконец-то, мы можем определить множество записей, которые будут записаны в тестовую таблицу сразу же после её создания. Формат довольно простой и требует минимум дальнейших разъяснений. Просто помните, что каждая запись в массиве $records должна иметь ключ для каждого поля, определенного в массиве $fields. Если поля для какой-то записи должно иметь значение NULL, то просто определите значение этого поля как NULL.



Импортирование информации из таблиц и записей


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


Начнем с примера. Предположим у вас есть модель Article (соответствует таблице articles). Изменим пример прикрепления, приведенные выше (app/tests/fixtures/article_fixture.php):


<?php  
   
class ArticleFixture extends CakeTestFixture 
          var 
$name 'Article'
          var 
$import 'Article'
   } 
   
?>


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


<?php   
class ArticleFixture extends CakeTestFixture {
    var 
$name 'Article';
    var 
$import = array('model' => 'Article''records' => true);  
}
?>


Если же у вас есть таблица, но нет модели для неё, то вы можете указать таблицу, а не модель:


<?php  
   
class ArticleFixture extends CakeTestFixture 
          var 
$name 'Article'
          var 
$import = array('table' => 'articles'); 
   } 
 
?>


Этот код будет импортировать определение таблицы из таблицы 'articles', используя 'default' соединение к базе данных. Если вы хотите изменить соединение, то делайте так:


<?php  
   
class ArticleFixture extends CakeTestFixture 
   var 
$name 'Article'
   var 
$import = array('table' => 'articles''connection' => 'other'); 
   } 
   
?>


Если в соединении к базе данных определен префикс, то он будет автоматически использоваться при получении информации о таблице. Предыдущие два примера не импортируют записи из таблицы. Чтобы заставить прикрепление также импортировать и записи внесите следующие изменения:


<?php  
   
class ArticleFixture extends CakeTestFixture 
          var 
$name 'Article'
          var 
$import = array('table' => 'articles''records' => true); 
   } 
 
?>


Также вы можете импортировать структуру таблицы из существующей модели/таблицы, а записи для этой таблицы определить непосредственно в прикриплении:


<?php  
   
class ArticleFixture extends CakeTestFixture 
          var 
$name 'Article'
          var 
$import 'Article'
           
          var 
$records = array( 
              array (
'id' => 1'title' => 'First Article''body' => 'First Article Body''published' => '1''created' => '2007-03-18 10:39:23''updated' => '2007-03-18 10:41:31'), 
              array (
'id' => 2'title' => 'Second Article''body' => 'Second Article Body''published' => '1''created' => '2007-03-18 10:41:23''updated' => '2007-03-18 10:43:31'), 
              array (
'id' => 3'title' => 'Third Article''body' => 'Third Article Body''published' => '1''created' => '2007-03-18 10:43:23''updated' => '2007-03-18 10:45:31'
          ); 
   } 
 
?>


<< Обзор тестирования | Создание тестов >>


 
Комментарии
Добавить комментарий:

Файлов нет. [Показать файлы/форму]