我在Laravel项目中运行测试时遇到问题

xyhw6mcr  于 2022-12-01  发布在  其他
关注(0)|答案(2)|浏览(127)

我的测试函数是

use RefreshDatabase;

public function create_route()
{
    $user = \App\Models\User::factory()->create();

    $this->actingAs($user)
        ->post(route('daily-logs.store'), [
            'log' => 'Logging from create route test',
            'day' => '2020-01-01',
        ]);

    $this->assertDatabaseHas('daily_logs', [
        'user_id' => $user->id,
        'log'     => 'Logging from create route test',
        'day'     => '2020-01-01 00:00:00',
    ]);
}

我的路线是这样的:

Route::post('/daily-logs', [DailyLogController::class, 'store'])->name('daily-logs.store');

我的控制器是这样的:

public function store(Request $request)
{
    return DailyLog::create([
        'user_id'=> $request->user()->id,
        'log'=> $request->log,
        'day'=> $request->day,
    ]);
}

如果我使用浏览器访问我的路由器,请求后,工作成功完成。但是,如果我使用我的测试功能,则显示错误信息。

怎么了?

svujldwt

svujldwt1#

该操作似乎从未执行过。
在Laravel测试中,在HTTP调用上创建Assert是一个很好的做法。
例如:

$this->post(...)
        ->assertSuccessful(); // or assertRedirect(), assertStatus(), ...

这只会告诉您状态代码(例如,302与成功的状态代码不匹配)。
要进行调试,一种方法是转储响应:

$this->post(...)
        ->dump();
qhhrdooz

qhhrdooz2#

兄弟,你得改变你的迁移。

Schema::create('daily_logs', function (Blueprint $table) {
  $table->id();
  $table->integer('user_id')->unsigned()->index();
  $table->text('log');
  $table->dateTime('day'); //change date to datetime
  $table->timestamps();
});

相关问题