[英]Route model binding not working properly on feature test laravel 8
在针对补丁端点进行功能测试时,我在控制器更新方法中获得了 Eloquent 的新实例,而不是所需的 Eloquent 模型。 PurchaseTest.php 中生成的 Eloquent 模型没有通过路由模型绑定传递给 PurchaseController.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');
});
});
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);
}
}
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.