繁体   English   中英

路由模型绑定在功能测试 laravel 8 上无法正常工作

[英]Route model binding not working properly on feature test laravel 8

在针对补丁端点进行功能测试时,我在控制器更新方法中获得了 Eloquent 的新实例,而不是所需的 Eloquent 模型。 PurchaseTest.php 中生成的 Eloquent 模型没有通过路由模型绑定传递给 PurchaseController.php。 但是当我通过浏览器使用它时,该路由正常工作。

网站.php
Route::name('admin.')->middleware(['admin'])->prefix('admin')->group(function () {
    Route::name('purchases.')->prefix('/purchases')->group(function () {
        Route::patch('/{purchase}/update', 'PurchaseController@update')->name('update');
    });
});
PurchaseTest.php
class PurchaseTest extends TestCase
{
    use RefreshDatabase;
    use WithoutMiddleware;

    public function test_purchase_can_be_updated()
    {
        $purchase = Purchase::create([
            "item" => "tariqs item",
            "support" => "2022-09-09",
            "status" => PurchaseStatus::ACTIVE,
            "purchase_code" => "1234",
            "username" => "tariq",
            "user_id" => "1",
        ]);
        
        // $purchase model is not passing to controller through this patch request.
        $response = $this->patch(route('admin.purchases.update', compact('purchase')), [
            "item" => "tariqs item edit",
            "support" => "2022-09-09",
            "status" => PurchaseStatus::ACTIVE,
            "purchase_code" => "1234",
            "username" => "tariq",
        ]);

        $response->assertStatus(200);
    }
}
PurchaseController.php
    public function update(Request $request, Purchase $purchase)
    {
        dd($purchase, $request->all());  // here $purchase is a new instance of $purchase, not the desired $purchase model.

        $input = $request->validate([
            "item" => "required|string",
            "support" => "required|date_format:Y-m-d",
            "status" => "required|string",
            "purchase_code" => "required|string",
            "username" => "required|string",
        ]);

        if ($purchase->update($input)) {
            $purchases = Purchase::where('user_id', $purchase->user_id)->get();
            return response()->json(['success' => 'true', 'msg' => __("Purchase code successfully updated."), 'embed' => view('admin.misc.purchase-list', compact('purchases'))->render()]);
        }

        throw ValidationException::withMessages(['error' => __('Something went wrong.')]);
    }

您可能需要在没有compact()的情况下进行路由调用,例如route('admin.purchases.update', $purchase)route('admin.purchases.update', $purchase->id) )

我终于解决了这个问题!

验证您是否在测试中使用了Trait WithoutMiddleware 如果是,则将其删除!

就我而言,这就是问题所在! 我在这里找到了

在 Laravel 中,模型路由绑定是由一个middleware完成的,所以当我使用这个Trait时,我删除了所有middlewares

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM