微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CakePHP单元测试只能工作一次,然后我必须重置数据库

我试图让我的团队开始为我们的应用程序进行一些单元测试.该应用程序基于CakePHP构建.

首先,我正在为用户表构建测试.我有以下夹具来创建一个供我测试的用户

namespace App\Test\Fixture;

use Cake\TestSuite\Fixture\TestFixture;

class UsersFixture extends TestFixture
{
      public $connection = 'test';

      public $import = ['table' => 'users'];

      public $records = [
          [
              'username' => 'TestPass',
              'password' => '',
              'email' => 'TestPass@example.com',
              'status' => 'active',
              'created' => '2015-11-04 12:00:00',
              'last_logindate' => null,
              'registration_country' => 'AU',
              'system_user' => 0
          ]
      ];
}

我也有一张表的TestCase:

namespace App\Test\TestCase\Model\Table;

use App\Model\Table\UsersTable;
use Cake\ORM\TableRegistry;
use Cake\TestSuite\TestCase;

/**
 * App\Model\Table\UsersTable Test Case
 */
class UsersTableTest extends TestCase
{

    /**
     * Fixtures
     *
     * @var array
     */
    public $fixtures = [
        'app.Users'
    ];

    /**
     * setUp method
     *
     * @return void
     */
    public function setUp()
    {
        parent::setUp();
        $config = TableRegistry::exists('Users') ? [] : ['className' => 'App\Model\Table\UsersTable'];
        $this->Users = TableRegistry::get('Users', $config);
    }

    /**
     * tearDown method
     *
     * @return void
     */
    public function tearDown()
    {
        unset($this->Users);

        parent::tearDown();
    }
    // ...
}

我第一次运行此测试时,它运行完美.如果尝试再次运行它,则会出现以下错误

Sebastian Bergmann和贡献者的PHPUnit 4.8.27.

Warning Error: Fixture creation for “users” FailedsqlSTATE[42000]:
Syntax error or access violation: 1101 BLOB/TEXT column ‘status’ can’t
have a default value” in
[/path-to-app/vendor/cakePHP/cakePHP/src/TestSuite/Fixture/TestFixture.PHP,
line 232]

Exception: Unable to insert fixtures for
“App\Test\TestCase\Model\Table\UsersTableTest” test case.
sqlSTATE[42S02]: Base table or view not found: 1146 Table
‘carebook_test.users’ doesn’t exist in
[/path-to-app/vendor/cakePHP/cakePHP/src/TestSuite/Fixture/FixtureManager.PHP,
line 253]

消除此错误的唯一方法似乎是删除数据库,重新创建数据库,然后再次运行迁移.之后,测试将再次成功运行,然后再次中断.

我究竟做错了什么?

编辑:似乎这样做的原因是一旦测试结束表就被删除.但是,如果该表不存在,则该测试不会自动创建该表,因此该测试仅运行一次.我想知道是否有一种方法可以使表被截断而不是删除.或使其创建,以使Fixtures将创建该表(如果该表不存在).我对这个问题的影响感到有些困惑,因为我希望这个问题会影响到每个人.

EDIT2:我发现CakePHP确实旨在创建表(如果它们不存在).对我来说,问题是我的列是ENUM,而CakePHP Fixtures不支持枚举列,因此它成为文本列.枚举列可以有认值(我的是),而文本列则不能.所以我想我必须弄清楚如何使CakePHP接受枚举列.

解决方法:

问题是CakePHPPHPUnit类的扩展添加了在测试运行后删除测试表的功能.在测试套件的下一次运行中,将使用夹具来重新创建表.

此行为对我不起作用,因为我的数据库表包含Enum列. CakePHP不支持ENUM列,而是将其视为文本列.这意味着重新创建表时,它们具有TEXT列而不是ENUM列.

可以,除了我的ENUM列具有认值,并且在Windows MysqL上尝试在TEXT列上设置认值会导致错误.这绊倒了CakePHP的测试运行程序,并阻止了我的测试运行.

我和一位同事共同为CakePHP创建了一个插件,该插件可使其与ENUM列一起正常工作.该插件目前尚未公开可用,但我们计划在工作不那么忙时将其作为开源发布.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐