【问题标题】:I am with problem to run test in project Laravel我在 Laravel 项目中运行测试时遇到问题
【发布时间】:2021-08-09 23:56:42
【问题描述】:

我的测试函数是这个

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,
    ]);
}

如果我使用带有请求发布的浏览器访问我的路由器,则工作已成功完成。但是,如果我正在使用我的测试功能,则会显示一条错误消息。

怎么了?

【问题讨论】:

  • 您确定验证通过了吗?要么是这样,要么是 DailyLog$fillable 属性需要更新。
  • 是的@cdruc,我在有无验证的情况下进行了测试。
  • 嗯...这很奇怪。你在使用RefreshDatabase 特征吗?通过在创建之前放置 dd($request->all()); 来测试它是否甚至会触发控制器操作 - 然后运行测试。
  • @cdruc 我测试了它并没有回答。就好像他没有进入路线一样。但如前所述,路线存在。它可以通过浏览器运行。
  • 是的,我使用 RefreshDatabase

标签: php laravel unit-testing testing phpunit


【解决方案1】:

似乎从未执行过该操作。

在 Laravel 测试中创建对 HTTP 调用的断言是一种很好的做法。

例如

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

这只会告诉您状态代码(例如 302 与成功的状态代码不匹配)。

要调试,一种方法是转储响应:

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

【讨论】:

    猜你喜欢
    • 2021-02-15
    • 2022-06-10
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多