Испытательные устройства CakePHP постоянно сбрасывают мои таблицы после запуска тестового примера - PullRequest
1 голос
/ 29 марта 2010

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

После запуска отдельного тестового примера мне необходимо повторно импортировать таблицы базы данных с помощью phpMyAdmin.

Вот соответствующие файлы:

Это класс, который я пытаюсь протестировать comment.php. Эта таблица отбрасывается после теста.

  App::import('Sanitize');

  class Comment extends AppModel{
  public $name      = 'Comment';

  public $actsAs    = array('Tree');

     public $belongsTo = array('User' => array('fields'=>array('id', 'username')));

  public $validate = array(
  'text'        => array(
  'rule'      =>array('between', 1, 4000),
  'required'  =>'true',
  'allowEmpty'=>'false',
  'message'   => "You can't leave your comment text empty!")
  );

database.php

class DATABASE_CONFIG {

var $default = array(
'driver'     => 'mysql',
'persistent' => false,
'host'       => 'project.db',
'login'      => 'projectman',
'password'   => 'projectpassword',
'database'   => 'projectdb',
'prefix'     => ''
);

var $test = array(
'driver'     => 'mysql',
'persistent' => false,
'host'       => 'project.db',
'login'      => 'projectman',
'password'   => 'projectpassword',
'database'   => 'testprojectdb',
'prefix'     => ''
 );
 }

Мой файл comment.test.php. Это таблица, которая продолжает падать.

<?php
App::import('Model', 'Comment');

class CommentTestCase extends CakeTestCase
{

  public $fixtures = array('app.comment');

  function start(){
    $this->Comment =& ClassRegistry::init('Comment');
    $this->Comment->useDbConfig = 'test_suite';
  }

Это мой класс comment_fixture.php:

  <?php
   class CommentFixture extends CakeTestFixture
   {
     var $name = "Comment";

     var $import = 'Comment';
   }

И на всякий случай вот типичный метод тестирования в классе CommentTestCase

   function testMsgNotificationUserComment(){
   $user_id       = '1';
    $submission_id = '1';
    $parent_id = $this->Comment->commentOnModel('Submission', $submission_id,     '0',    $user_id, "Says: A");

  $other_user_id = '2';
   $msg_id = $this->Comment->commentOnModel('Submission', $submission_id, $parent_id,      $other_user_id, "Says: B");

  $expected = array(array('Comment'=>array('id'=>$msg_id, 'text'=>"Says: B", 'submission_id'=>$submission_id, 'topic_id'=>'0', 'ack'=>'0')));

  $result = $this->Comment->getMessages($user_id);

  $this->assertEqual($result, $expected);
}

Я занимаюсь этим уже целый день, и меня начинает откладывать юнит-тестирование CakePHP. В дополнение к этой проблеме, Servral times теперь у меня есть данные, вставленные в конфигурацию базы данных «по умолчанию» после выполнения тестов! Что происходит с моей конфигурацией?!

Ответы [ 3 ]

4 голосов
/ 30 сентября 2010

в вашем классе CakeTestCase, просто поместите член dropTables :

<?php
App::import('Model', 'Comment');

class CommentTestCase extends CakeTestCase
{

  public $fixtures = array('app.comment');
  public $dropTables = false; // <- here it is 

  function start(){
    $this->Comment =& ClassRegistry::init('Comment');
    $this->Comment->useDbConfig = 'test_suite';
  }
3 голосов
/ 29 марта 2010

Я думаю, что это идея. Фиксаторами являются fixed таблицы с fixed содержимым. Это , а не таблицы, которые вы используете в производстве или в процессе разработки. Вот почему у них есть отдельное соединение в database.php, вы должны использовать другую базу данных или хотя бы другой префикс для тестовых таблиц. Они будут создаваться на основе ваших приборов перед каждым тестом, а затем уничтожаться, поэтому вы всегда проводите тестирование на известном наборе данных.

2 голосов
/ 31 марта 2010

Ваша конфигурация базы данных выглядит правильно ...

Вы не должны делать

$this->Comment->useDbConfig = 'test_suite';

Моя рекомендация

Вы должны использовать оболочку cake bake , чтобы создать модели для всех ваших моделей и позволить им перезаписать их (очевидно, сначала создайте резервную копию любых пользовательских моделей). Вам не нужно проходить через запросы на проверку и сопоставление (например, «n»), но да для всех перезаписей (опять же, сначала сделайте резервную копию кода).

Когда вы это делаете, он также создает базовый тестовый пример и приспособление для модели.

Используйте созданный тестовый пример и добавьте к нему ...

То, что вам нужно, - это называть КАЖДЫЙ единственный используемый вами прибор и все связанные с ним приборы ... всем ассоциациям hasMany и ownTo и HABTM требуется загрузить прибор, но они не будут автоматически вызваны в тесте. люкс.

note.test.php

<?php 
App::import('Model', 'Note');
class NoteTestCase extends CakeTestCase {
    var $Note = null;
    var $fixtures = array(
        'app.note',
        'app.version',
        'app.corp',
        'app.advertisement',
        'app.member',
        'app.member_detail',
        'app.member_newsletter',
        'app.groups_members_join',
        'app.group',
        'app.job',
        'app.job_category',
        'app.jobs_categories_join',
        );
    function startTest() {
        $this->Note =& ClassRegistry::init('Note');
    }
    function testNoteInstance() {
        $this->assertTrue(is_a($this->Note, 'Note'));
    }
    function testNoteFind() {
        $this->Note->recursive = -1;
        $results = $this->Note->find('first');
        $this->assertTrue(!empty($results));
        $expected = array('Note' => array(
            'id' => 1,
            'model' => 'Lorem ipsum dolor sit amet',
            'model_id' => 1,
            'created' => '2010-03-30 16:26:59',
            'member_id' => 1,
            'body' => 'Lorem ipsum dolor sit amet, aliquet feugiat. Convallis morbi fringilla gravida,phasellus feugiat dapibus velit nunc, pulvinar eget sollicitudin venenatis cum nullam,vivamus ut a sed, mollitia lectus. Nulla vestibulum massa neque ut et, id hendrerit sit,feugiat in taciti enim proin nibh, tempor dignissim, rhoncus duis vestibulum nunc mattis convallis.',
            'is_active' => 1
        ));
        $this->assertEqual($results, $expected);
    }
    function testJobWithNotes() {
        $this->Job =& ClassRegistry::init('Job');
        $uniqueValue = rand(0,time());
        $savedJob = $this->Job->saveAll(array(
            'Job' => array(
                'title' => "Test Job [$uniqueValue] from ".__FILE__,
            ),
            'Note' => array(
                array(
                    'model' => "Job",
                    'body' => "Here is a unique value [$uniqueValue]")
            )));
        $this->assertTrue($savedJob);
        $this->assertEqual($this->Note->find('first',array(
            'fields' => array('body'),
            'conditions' => array('model_id' => $this->Job->id, 'model' => $this->Job->name))),
            array('Note'=>array('body'=>"Here is a unique value [$uniqueValue]")));
    }
}
?>

И на всякий случай, вот это

note_fixture.php

<?php 
class NoteFixture extends CakeTestFixture {
    var $name = 'Note';
    var $fields = array(
        'id' => array('type'=>'integer', 'null' => false, 'default' => NULL, 'key' => 'primary'),
        'model' => array('type'=>'string', 'null' => false, 'default' => NULL, 'length' => 32),
        'model_id' => array('type'=>'integer', 'null' => false, 'default' => NULL),
        'created' => array('type'=>'datetime', 'null' => false, 'default' => NULL),
        'member_id' => array('type'=>'integer', 'null' => false, 'default' => NULL),
        'body' => array('type'=>'text', 'null' => false, 'default' => NULL),
        'is_active' => array('type'=>'boolean', 'null' => false, 'default' => '1'),
        'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1))
    );
    var $records = array(array(
        'id' => 1,
        'model' => 'Lorem ipsum dolor sit amet',
        'model_id' => 1,
        'created' => '2010-03-30 16:26:59',
        'member_id' => 1,
        'body' => 'Lorem ipsum dolor sit amet, aliquet feugiat. Convallis morbi fringilla gravida,phasellus feugiat dapibus velit nunc, pulvinar eget sollicitudin venenatis cum nullam,vivamus ut a sed, mollitia lectus. Nulla vestibulum massa neque ut et, id hendrerit sit,feugiat in taciti enim proin nibh, tempor dignissim, rhoncus duis vestibulum nunc mattis convallis.',
        'is_active' => 1
    ));
}
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...