Laravel 单元测试迁移失败

Posted

技术标签:

【中文标题】Laravel 单元测试迁移失败【英文标题】:Laravel Unit Testing Migration fails 【发布时间】:2015-02-05 11:29:25 【问题描述】:

我正在尝试运行 phpUnit 测试。我在:memory 中为测试环境设置了SQLite。在我的设置中,我调用了Artisan::call('migrate'),但随后出现以下错误:

一般错误:1 无法添加默认值为 NULL 的 NOT NULL 列 (SQL: alter table "admins" add column "title" text not null)

基本上,任何修改现有表的迁移文件都会返回错误。为什么?

这是抱怨的文件迁移:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;

class AddTitleToAdminsTable extends Migration 

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::table('admins', function(Blueprint $table)
        
            $table->text('title');
        );
    


    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    
        Schema::table('admins', function(Blueprint $table)
        
            $table->dropColumn('title');
        );
    


【问题讨论】:

这个错误看起来像是您的迁移出了问题,而不是您调用它的方式。您能否通过产生此错误的迁移更新问题? @lukasgeiter,感谢您的回复。我更新了我的答案 【参考方案1】:

我做了一些研究,在 Stack Overflow 上找到了this post。

SQLite 的列NOT NULL 似乎存在问题,但没有默认值。在相同情况下,mysql 只使用空字符串(对于 varchar)或“0”(对于数字)。所以它有点内置默认值。

要解决您的问题,您可以使列可为空(仅当您希望它可为空时)或定义一个默认值

$table->text('title')->nullable();

$table->text('title')->default('');

【讨论】:

以上是关于Laravel 单元测试迁移失败的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 单元测试断言函数总是失败

Laravel 单元测试显示完全错误

PHP单元,使用单元测试测试laravel日志消息

在Laravel PHP单元测试中,Regex的Range值失败

在laravel 5.1单元测试中嘲笑hasMany关系

iOS 单元测试在 CocoaPods Google Maps SDK 上失败