Yii2没有卸载,没有加载依赖项

时间:2016-04-19 21:23:42

标签: yii2 yii2-advanced-app

卸载问题

我正在尝试在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名称表,我可以加载灯具。

1 个答案:

答案 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',
        ],
...
    ];
}