【问题标题】:How to load Yii 2 fixture?如何加载 Yii 2 夹具?
【发布时间】:2016-10-12 20:40:16
【问题描述】:

我使用一个简单的夹具来填充测试数据库中的表。但是当我尝试加载它时,检查完整性代码会抛出异常“找不到表:[]”。

我的灯具:

<?php

namespace tests\unit\fixtures;

use yii\test\ActiveFixture;

class IdentityDocumentFixture extends ActiveFixture
{
    public $modelClass = 'backend\modules\persons\models\IdentityDocument';
}

要加载夹具,我使用来自@app/tests 的这个命令:yii fixture/load IdentityDocument

C:\php-projects\ais\tests\codeception\bin>yii fixture/load IdentityDocument
Fixtures namespace is:
        tests\unit\fixtures

Global fixtures will be used:

        1. yii\test\InitDb

Fixtures below will be loaded:

        1. IdentityDocument

Load above fixtures? (yes|no) [no]:yes

因此,我收到以下错误消息:

异常 'yii\base\InvalidParamException' 带有消息 'Table not found: []' C:\php-projects\ais\vendor\yiisoft\yii2\db\mssql\QueryBuilder.php:180

堆栈跟踪:

0 C:\php-projects\ais\vendor\yiisoft\yii2\db\Command.php(753): yii\db\mssql\QueryBuilder->checkIntegrity(false, '', '') 1 C:\php-projects\ais\vendor\yiisoft\yii2\test\InitDbFixture.php(94): yii\db\Command->checkIntegrity(false, '') 2 C:\php-projects\ais\vendor\yiisoft\yii2\test\InitDbFixture.php(76): yii\test\InitDbFixture->checkIntegrity(false) 3 C:\php-projects\ais\vendor\yiisoft\yii2\test\FixtureTrait.php(114): yii\test\InitDbFixture->beforeUnload() 4 C:\php-projects\ais\vendor\yiisoft\yii2\console\controllers\FixtureController.php(147): yii\console\controllers\FixtureController->unloadFixtures(Array) 5 【内部功能】: yii\console\controllers\FixtureController->actionLoad('IdentityDocumen...') 6 C:\php-projects\ais\vendor\yiisoft\yii2\base\InlineAction.php(55): call_user_func_array(数组,数组)7 C:\php-projects\ais\vendor\yiisoft\yii2\base\Controller.php(154): yii\base\InlineAction->runWithParams(Array) 8 C:\php-projects\ais\vendor\yiisoft\yii2\console\Controller.php(91): yii\base\Controller->runAction('load', Array) 9 C:\php-projects\ais\vendor\yiisoft\yii2\base\Module.php(454): yii\console\Controller->runAction('load', Array) 10 C:\php-projects\ais\vendor\yiisoft\yii2\console\Application.php(167): yii\base\Module->runAction('fixture/load', Array) 11 C:\php-projects\ais\vendor\yiisoft\yii2\console\Application.php(143): yii\console\Application->runAction('fixture/load', Array) 12 C:\php-projects\ais\vendor\yiisoft\yii2\base\Application.php(375): yii\console\Application->handleRequest(Object(yii\console\Request)) 13 C:\php-projects\ais\tests\codeception\bin\yii(22): yii\base\Application->run() 14 {main}

如何加载夹具?测试数据库存在,数据源配置正确。


[更新]

表的真实名称是tbl_identitydocument

CREATE TABLE [dbo].[tbl_identitydocument](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](100) NOT NULL,
    [FISID] [int] NULL,
 CONSTRAINT [PK_tbl_identitydocument] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

这里是模型IdentityDocument的方法tableName()

public static function tableName()
{
    return '{{%identitydocument}}';
}

型号代码完整:

<?php

namespace backend\modules\persons\models;

use Yii;
use backend\modules\persons\Module;

/**
 * This is the model class for table "{{%identitydocument}}".
 *
 * @property integer $ID
 * @property string $Name
 * @property integer $FISID
 */
class IdentityDocument extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return '{{%identitydocument}}';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['Name'], 'required'],
            [['Name'], 'string'],
            [['FISID'], 'integer']
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'ID' => Module::t('ML', 'ID'),
            'Name' => Module::t('ML', 'Name'),
            'FISID' => Module::t('ML', 'FISID'),
        ];
    }
}

在调试器下我可以看到 IdentityDocument::tableName() 方法返回:

$tableNameTmp = IdentityDocument::tableName();

我看到$tableNameTmp 等于{{%identitydocument}}逐字逐句,返回这个字符串)


[更新]

在调试器下,我可以看到以下内容。在TestCase.php 类中有一个方法setUp()

/**
 * @inheritdoc
 */
protected function setUp()
{
    parent::setUp();
    $this->mockApplication();
    $this->unloadFixtures();
    $this->loadFixtures();
}

这里抛出异常:$this-&gt;unloadFixtures():

在屏幕截图中,可以看到 initScript 引用了路径 @app/tests/fixtures/initdb.php 但没有这样的文件schemas 数组还包含一个元素 ""


[更新]

我在这里使用了@slinstj 编写的说明 - Run fixture/load User fails to load User data。在我的本地项目(高级模式和 MySQL rdbms)中,夹具已成功加载:

【问题讨论】:

  • 嗨 Aleksey,IdentityDocument 的表的真实名称是什么,IdentityDocument::tableName() 返回的名称是什么?
  • 看来是对的!我会试一试...见下文。

标签: php unit-testing yii2 fixtures codeception


【解决方案1】:

1 - 检查您是否为yii\db\Connection 设置了tablePrefix 参数:

'components' => [
    'db' => [
        'class' => '\yii\db\Connection',
        'dsn' => 'mysql:host=127.0.0.1;dbname=demo',
        'username' => 'root',
        'password' => '',
        'charset' => 'utf8',
        'tablePrefix' => 'tbl_', // <<<<<<<<
    ],
],

来自docs的更多信息:

$tablePrefix:

表名的通用前缀或后缀。如果将表名指定为 {{%TableName}},则百分比字符 % 将替换为此属性值。例如,{{%post}} 变为 {{tbl_post}}。

2 - 设置dataFile 路径:

根据this

// In your IdentityDocumentFixture, set this:
public $dataFile = __DIR__ . '/path/to/your/data-file.php';

【讨论】:

猜你喜欢
  • 2018-05-16
  • 1970-01-01
  • 2019-12-20
  • 2012-04-10
  • 2013-03-06
  • 2015-12-19
  • 1970-01-01
  • 2011-08-30
  • 2011-09-15
相关资源
最近更新 更多