前言
忽然想起之前用codecetion时让我胆战心惊的那刻,那天我在测试服务器上研究着codeception,忽然同事大叫,怎么用户表被清空了,我当时觉得跟自己没关,但想起我今天刚把codeception的config配置更改了,链接到了测试数据库上,并且运行过里面自带的登陆案例,但运行结果是失败的,我觉得很有可能是我捅的篓子,所以我就开始找代码,结果真的是我干的。
怎么找到的
用户表只剩一条数据,就是运行codeception时加的,我根据里面的数据找到了存放数据的文件
tests\codeception\common\unit\fixtures\data\models\user.php
return [
[
'username' => 'bayer.hudson',
'auth_key' => 'HP187Mvq7Mmm3CTU80dLkGmni_FUH_lR',
//password_0
'password_hash' => '$2y$13$EjaPFBnZOQsHdGuHI.xvhuDp1fHpo8hKRSk6yshqa9c5EG8s3C3lO',
'password_reset_token' => 'ExzkCOaYc1L8IOBs4wdTGGbgNiG3Wz1I_1402312317',
'created_at' => '1402312317',
'updated_at' => '1402312317',
'email' => 'nicole.paucek@schultz.info',
],
];
怎么解决的
注释掉这个方法中的数据
namespace tests\codeception\frontend\unit\models;
class SignupFormTest extends DbTestCase
{
public function fixtures()
{
return [
/*'user' => [
'class' => UserFixture::className(),
'dataFile' => '@tests/codeception/frontend/unit/fixtures/data/models/user.php',
],*/
];
}
}
重新运行了了一下单元测试SignupFormTest ,这次数据没有被删除掉
危险原因
我研究了一下被删除的原因,找到了框架底层的代码
namespace yii\test;
class ActiveFixture extends BaseActiveFixture
{
public function load()
{
$this->resetTable();
$this->data = [];
$table = $this->getTableSchema();
foreach ($this->getData() as $alias => $row) {
$primaryKeys = $this->db->schema->insert($table->fullName, $row);
$this->data[$alias] = array_merge($row, $primaryKeys);
}
}
protected function resetTable()
{
$table = $this->getTableSchema();
$this->db->createCommand()->delete($table->fullName)->execute();
if ($table->sequenceName !== null) {
$this->db->createCommand()->resetSequence($table->fullName, 1)->execute();
}
}
}
就是这个resetTable方法把数据给清空了,所以大家还是慎重使用Fixture,虽然是测试服务器,但是里面的数据也是非常重要的。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。