我试图让我的团队开始为我们的应用程序进行一些单元测试.该应用程序基于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” Failed “sqlSTATE[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接受枚举列.
解决方法:
问题是CakePHP对PHPUnit类的扩展添加了在测试运行后删除测试表的功能.在测试套件的下一次运行中,将使用夹具来重新创建表.
此行为对我不起作用,因为我的数据库表包含Enum列. CakePHP不支持ENUM列,而是将其视为文本列.这意味着重新创建表时,它们具有TEXT列而不是ENUM列.
可以,除了我的ENUM列具有默认值,并且在Windows MysqL上尝试在TEXT列上设置默认值会导致错误.这绊倒了CakePHP的测试运行程序,并阻止了我的测试运行.
我和一位同事共同为CakePHP创建了一个插件,该插件可使其与ENUM列一起正常工作.该插件目前尚未公开可用,但我们计划在工作不那么忙时将其作为开源发布.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。