【发布时间】:2020-03-30 09:27:45
【问题描述】:
我在 Laravel 6 项目中的测试类有问题。以下测试失败,因为返回的响应是 403 forbidden 而不是视图。但是,我只能在测试中重现这一点——在主应用程序中,它按预期返回视图。有没有人经历过类似的事情或可以在下面看到任何明显错误的事情?
ProductTest.php
public function testUsersCanViewTheirOwnProducts(){
$user = Factory(User::class)->create();
$product = Factory(Product::class)->create(['user_id'=>$user->id]);
$this->actingAs($user);
$response = $this->get(route('show_product',['product'=>$product->id]));
$response->assertViewIs('products.show'); //Fails not a view (403 forbidden when response dumped)
$response->assertViewHas('product',$product);
}
转储$user->id 和$product->id 按预期返回1。
ProductController.php
public function __construct()
{
$this->authorizeResource(Product::class, 'product');
}
//...
public function show(Product $product)
{
return view("products.show",['product'=>$product]);
}
ProductPolicy.php
public function view(User $user, Product $product)
{
return $user->id === $product->user_id;
}
testing.env
//identical to .env apart from
TELESCOPE_ENABLED=false
DB_DATABASE=subscribe_test
routes/web.php
Route::get('/manage/products/{product}','ProductController@show')->middleware('auth')->name('show_product');
我已清除所有缓存但没有任何效果。该资源在 PHPUnit 测试中返回 403,在应用程序中返回 200。缺少什么?
【问题讨论】:
-
您是否将策略添加到服务提供商?
-
您使用的是什么身份验证驱动程序?您可能需要在actingAf 中指定
-
@EliasSoares 通过命名约定和默认身份验证驱动程序(用户表)自动发现。感谢您的帮助!
-
你能发布你的路线吗?
-
@EliasSoares 已添加到路线中。我有预期的行为(见答案),但不知道为什么会这样?