CakePHP PHPUnit Fixtures每次都删除数据库表

Bry*_*yan 4 database phpunit cakephp fixtures

我试图在我的模型上运行一个简单的单元测试.问题是每次运行测试时,我的数据库表都被删除了.我有公共$ dropTables = false; 任何人都可以找出为什么merchant_rejects表仍然被删除?正如您将看到的,我在我的夹具中尝试了许多不同的方法.

我想我必须逐步完成代码并弄清楚何时删除表.

这是我的夹具MovieStarFixture.php的代码:

class MovieStarFixture extends CakeTestFixture {
//  NEW TRY from http://stackoverflow.com/a/2548908/55124
var $name = 'MovieStar';
var $fields = array(
    'id'       => array(
                      'type'=>'string',
                      'null' => false,
                      'default' => NULL,
                      'length' => 36,
                      'key' => 'primary'),

    'movie_id' => array(
                      'type'=>'string',
                      'null' => false,
                      'default' => NULL,
                      'length' => 36),

    'trace' => array('type'=>'string', 'null' => false, 'default' => NULL),
    'star_date' => array(
                       'type'=>'datetime',
                       'null' => false,
                       'default' => NULL),
    'movie_star_type_id' => array(
                       'type'=>'string',
                       'null' => false,
                       'default' => NULL,
                       'length' => 36),
    'code' => array('type'=>'text', 'null' => false, 'default' => NULL),
    'amount' => array('type'=>'float', 'null' => false, 'default' => 0),
    'movie_star_recurrance_id' => array(
                       'type'=>'string',
                       'null' => false,
                       'default' => NULL, 
                       'length' => 36),
    'open' => array('type'=>'boolean', 'null' => false, 'default' => '1'),
    'loss_axia' => array('type'=>'float', 'null' => true, 'default' => 0),
    'loss_mgr1' => array('type'=>'float', 'null' => true, 'default' => 0),
    'loss_mgr2' => array('type'=>'float', 'null' => true, 'default' => 0),
    'loss_rep' => array('type'=>'float', 'null' => true, 'default' => 0)
    );
var $records = array(
                array(
                'id' => '52ab9259-0070-4583-8d6f-4ac6c0a81cd7',
                'movie_id' => '440b7d13-5618-4560-be1d-93c5a2900a5e',
                'trace' => '3331313133423',
                'star_date' => '2013-12-13',
                'movie_star_type_id' => '64f7c386-6725-4c62-83ac-ae309bec8b10',
                 'code' => 'C01',
                'amount' => '222.0000',
                'movie_star_recurrance_id' => '',
                'open' => true,
                'loss_axia' => '23.0000',
                'loss_mgr1' => '0',
                'loss_mgr2' => '0',
                'loss_rep' => '0'
));

     //  THESE ARE ALL OF THE OTHER METHODS I HAVE TRIED
// Loading Fixture Methods / / / / / / / / / / / / / / / / / / / / / / / /  

// #1 - Import model and records / / / / / / / / / / / / / / / / / / / / /  
//public $import = array('model' => 'MovieStar', 'records' => true);


// #2 - Use onlt table info - no model / / / / / / / / / / / / / / / / / /  
// public $import = array('table' => 'movie_stars', 'records' => true);


// #3 - Specify Model and Create Records - Binds Data to Database/ / / / / 
/*
    public $records = array(
                 array(
        'MovieStar' => array(
        'id' => '52ab917d-549c-493b-9ef5-54a1c0a81cd7',
        'movie_id' => '440b7d13-5618-4560-be1d-93c5a2900a5e',
        'trace' => '3331313133',
        'star_date' => '2013-12-13',
        'movie_star_type_id' => '64f7c386-6725-4c62-83ac-ae309bec8b10',
        'code' => 'C01',
        'amount' => '122.0000',
        'movie_star_recurrance_id' => '',
        'open' => true,
        'loss_axia' => null,
        'loss_mgr1' => null,
        'loss_mgr2' => null,
        'loss_rep' => null
        )
    )
    );
public $import = array('model' => 'MovieStar', 'records' => false);
    */  

// #4 - Specify Model and Create Records in Init / / / / / / / / / / / / / 
// public $import = 'MovieStar';

/* public function init() {
        $records = array(
        array(
            'MovieStar' => array(
            'id' => '52ab917d-549c-493b-9ef5-54a1c0a81cd7',
            'movie_id' => '440b7d13-5618-4560-be1d-93c5a2900a5e',
            'trace' => '3331313133',
            'star_date' => '2013-12-13',
            'movie_star_type_id' => '64f7c386-6725-4c62-83ac-ae309bec8b10',
            'code' => 'C01',
            'amount' => '122.0000',
            'movie_star_recurrance_id' => '523525',
            'open' => true,
            'loss_axia' => null,
            'loss_mgr1' => null,
            'loss_mgr2' => null,
            'loss_rep' => null
              )
        )
        );
        parent::init();
}*/

// #5 - Try Model Setup / / / / / / / / / / / / / / / / / / / / / / / / 
// This drops all records after the first test
/*public $records = array(
     array(
        'MovieStar' => array(
        'id' => '52ab917d-549c-493b-9ef5-54a1c0a81cd7',
        'movie_id' => '440b7d13-5618-4560-be1d-93c5a2900a5e',
        'trace' => '3331313133',
        'star_date' => '2013-12-13',
        'movie_star_type_id' => '64f7c386-6725-4c62-83ac-ae309bec8b10',
        'code' => 'C01',
        'amount' => '122.0000',
        'movie_star_recurrance_id' => '',
        'open' => true,
        'loss_axia' => null,
        'loss_mgr1' => null,
        'loss_mgr2' => null,
        'loss_rep' => null
    )
       )
    );

   }*/
Run Code Online (Sandbox Code Playgroud)

这是我的MovieStarTest.php:

<?php
App::uses('Controller', 'Controller');
App::uses('View', 'View');
App::uses('MovieStar', 'Model');

/**
 * MovieStar Test Case
 *
 */
class MovieStarTest extends CakeTestCase {

/**
 * Fixtures
 *
 * @var array
 */
public $fixtures = array(
    'app.movie_star'//,
    //'app.movie_star_recurrance',
    //'app.movie_star_type',
    //'app.movie',
    //'app.user',
    //'app.movie_star_line',
    //'app.movie_star_status'
);

public $autoFixtures = false;
public $dropTables = false; 

/**
 * setUp method
 *
 * @return void
 */
public function setUp() {
    parent::setUp();

    $this->MovieStar =& ClassRegistry::init('MovieStar');
    $this->MovieStar->useDbConfig = 'test';

    //$this->MovieStar->query("SELECT truncate_tables('axia')");

    // load data
    $this->loadFixtures('MovieStar');
}

/**
 * tearDown method
 *
 * @return void
 */
public function testFixtures() {
    $numberOfResults = $this->MovieStar->find('count');
    debug($numberOfResults);
    $resultGreaterThanMinimumValue = $numberOfResults > 2;
    $this->assertTrue($resultGreaterThanMinimumValue);
}

public function testFixtures2() {
    $numberOfResults = $this->MovieStar->find('count');
    debug('$numberOfResults');
    debug($numberOfResults);
    $resultIsZero = $numberOfResults == 0;
    $this->assertTrue($resultIsZero);
}

public function testFindStarsByMovieId() {
    $movieId = '440b7d13-5618-4560-be1d-93c5a2900a5e';
    $result = $this->MovieStar->findStarsByMovieId($movieId);
    $expected = array(
        array(
'MovieStar' => array(
    'id' => '52ab9259-0070-4583-8d6f-4ac6c0a81cd7',
    'movie_id' => '440b7d13-5618-4560-be1d-93c5a2900a5e',
    'trace' => '3331313133423',
    'star_date' => '2013-12-13',
    'movie_star_type_id' => '64f7c386-6725-4c62-83ac-ae309bec8b10',
    'code' => 'C01',
    'amount' => '222.0000',
    'movie_star_recurrance_id' => '',
    'open' => true,
    'loss_axia' => '23.0000',
    'loss_mgr1' => null,
    'loss_mgr2' => null,
    'loss_rep' => null
        )
    )
    );

    debug("Expected");
    debug($expected);
    debug("Result");
    debug($result);

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

public function tearDown() {
    //$this->MovieStar->deleteAll(true, true);
    //unset($this->MovieStar);

    parent::tearDown();
}

}
Run Code Online (Sandbox Code Playgroud)

我应该能够通过添加来删除表

 public $dropTables = false; 
Run Code Online (Sandbox Code Playgroud)

但我没有看到在lib/Cake/TestSuite/Fixture/CakeFixtureManager.php中检查此方法之前dropTables的值 在此输入图像描述

实际上这会截断整个数据库.我的桌子被丢弃在哪里?

小智 8

接受的答案无法解决问题:

我有公共$ dropTables = false; 任何人都可以找出为什么merchant_rejects表仍然被删除?

来自cakephp文档:

$ dropTables

控制表创建/删除每个测试方法.

将此属性设置为false可避免在每个测试方法之间已存在表格时将其删除.在每个测试运行程序执行结束时,表仍将被删除.

请注意这一部分:

在每个测试运行程序执行结束时,表仍将被删除

因此,即使您public $dropTables = false;在每次测试运行后仍然会丢弃绑在夹具上的工作台.接受的答案并不能阻止这种情况.

为了防止这种情况,请执行以

像这样创建你的夹具:

class MovieStarFixture extends CakeTestFixture {

    public $import = 'MovieStar';

    //data will be loaded into this fixture by the test cases

    // do not truncate movie_stars table between tests
    public function truncate($db){

        return null;
    }

    // do not drop movie_stars table between tests
    public function drop($db){

        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

这可以防止夹具在每种测试方法后截断和掉落.这是通过使夹具"假装"它下降并在测试之间截断表来完成的.但是这意味着夹具会认为表被删除并尝试在每个测试方法运行的开始时重新创建它,这将导致错误(关于创建现有表的警告),所以你还必须......

做这个:

在MovieStarTest中添加public $dropTables = false;.这将阻止夹具在已经存在的情况下尝试放置它.由于在测试开始时不丢弃表,因此fixture不会尝试创建表.这就是我们想要的,因为该表已经存在.

现在,您将在CakeTestCase :: test*()方法调用之间保留数据.