卸载问题
我正在尝试在Yii2中创建灯具,以便能够用一些测试数据填充我的表格。我还没有使用Codeception。我正在关注灯具Yii2 guide。第一个表是User表:
namespace tests\unit\fixtures;
use yii\test\ActiveFixture;
/**
* User fixture
*/
class UserFixture extends ActiveFixture
{
public $modelClass = 'common\models\User';
}
当我进入Vagrant并加载夹具时,这个工作正常,但在我卸载后,条目仍在那里。根据终端输出,夹具成功卸载。我在这里错过了什么?这应该是开箱即用还是你应该创建自己的卸载功能?
编辑: 什么帮助将此添加到用户夹具:
public function unload(){
parent::unload();
$this->resetTable();
}
我希望无论如何都会出现在卸载状态,但我已经阅读了下面发布的链接中的(非常慢)讨论。我不知道parent :: unload()行是否必要,它在没有行的情况下工作,但BaseActiveFixture定义它并清空$ this-> data和$ this-> _models。
取决于问题
我的第二个夹具取决于用户夹具:
namespace tests\unit\fixtures;
use yii\test\ActiveFixture;
/**
* User Libraries fixture
*/
class UserLibrariesFixture extends ActiveFixture
{
public $modelClass = 'common\models\UserLibraries';
// Dependencies
public $depends = [
'tests\unit\fixtures\UserFixture',
];
}
这个也根据终端正确加载,但UserLibraries表仍为空。它并没有说它会加载依赖项,但我不知道它是否应该说它会。
我保持数据文件尽可能简单,并且User表中显示正确的数据。我只为UserLibraries表添加了必填字段的数据,所以我不知道这是否是一个问题。是否有一个日志文件,我可以检查有关灯具的条目?
编辑: UserLibraries夹具现在能够在User表中创建数据(但不是UserLibraries表),因此禁用外键检查适用于具有依赖关系的夹具。这让我觉得我的UserLibraries数据文件中有一个错误。检查我是否需要日志文件。
EDIT2: 夹具装载问题解决方案
由于表名中有下划线,因此无法加载灯具。当使用Gii创建时,表名userLibraries和user_libraries将生成具有相同文件名的模型,控制器和视图文件。使用camelcase名称表,我可以加载灯具。
答案 0 :(得分:1)
卸载灯具是一个“正在讨论中”的问题(see here)。但这是我的mysql解决方法(我也在那里评论)并且应该添加到每个具有一些依赖表的fixture模型中:
<?php
namespace tests\codeception\common\fixtures;
use yii\test\ActiveFixture;
class VariationFixture extends ActiveFixture
{
public $modelClass = 'common\models\Variation';
public function beforeLoad() {
parent::beforeLoad();
$this->db->createCommand()->setSql('SET FOREIGN_KEY_CHECKS = 0')->execute();
}
public function afterLoad() {
parent::afterLoad();
$this->db->createCommand()->setSql('SET FOREIGN_KEY_CHECKS = 1')->execute();
}
}
对于加载,使用代码可以使用/tests/codeception/common/_support/FixtureHelper::fixtures()
来定义每个测试用例之前要加载的灯具:
public function fixtures()
{
return [
'user' => [
'class' => UserFixture::className(),
'dataFile' => '@tests/codeception/common/fixtures/data/init_login.php',
],
'room' => [
'class' => RoomFixture::className(),
'dataFile' => '@tests/codeception/common/fixtures/company/data/room.php',
],
...
];
}