首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >+测试编辑数据库的手工命令

+测试编辑数据库的手工命令
EN

Stack Overflow用户
提问于 2015-04-17 16:18:07
回答 1查看 224关注 0票数 1

我正在尝试测试一个artisan命令,该命令旨在进行一些数据库维护。

特别是,它搜索没有填充列的记录,并填充它。

这是命令的fire()方法的简化版本:

代码语言:javascript
复制
public function fire()
{
    $items = Item::all();

    $total = $items->count();
    $updated = 0;

    foreach ($items as $item) {
        if ($item->myColumn != 'x') {
            $item->myColumn = 'x';
            $item->save();

            $updated++;
        }
    }

    $this->info("total: $total updated: $updated");
}

我的(接受)测试非常简单,并执行以下操作:

  • 在db中插入记录
  • 调用artisan命令
  • 检查插入的记录是否已更新

这是代码:

代码语言:javascript
复制
public function doTheTest(AcceptanceTester $I)
{
    $I->wantTo('setup the myColumn when it is not set');

    $id = $I->haveRecord('items', [
        'myColumn' => '',
    ]);

    $I->runShellCommand('php artisan items:updater');

    $I->seeRecord('items', [
        'id'       => $id,
        'myColumn' => 'x',
    ]);
}

但是,测试失败了,我得到以下消息:

代码语言:javascript
复制
Couldn't see record "items",{"id":101,"myColumn":"x"}:
Couldn't find items with {"id":101,"code":"x"}

如您所见,新记录的id为101,因为db转储中已经有100个项,但奇怪的是,命令中的$this->info()会打印。

代码语言:javascript
复制
total: 100 updated: 100

好像测试中使用的数据库和artisan中使用的数据库是不同的。

此外,如果在测试结束时,我尝试获取添加的记录,并打印它,如下面的代码段所示

代码语言:javascript
复制
public function doTheTest(AcceptanceTester $I)
{
    /* ... */

    $item = $I->grabRecord('items', [
        'id'       => $id,
    ]);

    \Codeception\Util\Debug::debug($item);
}

然后运行codecept run acceptance --debug命令,我将得到添加的记录

代码语言:javascript
复制
stdClass Object
(
    [id] => 101
    [myColumn] =>
)

我很困惑,因为这里只有一个数据库,但我在这里肯定误解了一些重要的东西。

有人能帮我吗?

非常感谢,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-17 23:24:48

问题是,使用Laravel4模块的每个查询都在一个事务中运行,在默认情况下,该事务将在最后回滚。如果您查看一下配置部分的Laravel4文档,它会声明

清除:布尔值,默认为true -所有db查询都将在事务中运行,并在测试结束时回滚。

如果重新启动MySQL服务器(在这种情况下,当您再次运行测试时仍然会看到id 101),您可以检查这一点,或者查看MySQL日志,这些日志将包含一个条目,如下所示:

150417 23:24:24 2将根@localhost连接到laravel上-测试 2准备设置名称'utf8‘,整理'utf8_unicode_ci’ 2执行设置名称'utf8‘,整理'utf8_unicode_ci’ 2密闭stmt 2查询开始事务 2准备插入items (myColumn)值(?) 2执行插入到items (myColumn)值('') 2密闭stmt 2查询回滚 2退出

要解决这个问题,您需要在您的cleanup文件中配置Laravel4模块的选项,如下所示:

代码语言:javascript
复制
modules:
    config:
        Laravel4:
        cleanup: false
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29704515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档