【问题标题】:Why is a request returning forbidden only in PHPUnit testing?为什么仅在 PHPUnit 测试中禁止返回请求?
【发布时间】: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 已添加到路线中。我有预期的行为(见答案),但不知道为什么会这样?

标签: php laravel phpunit


【解决方案1】:

我通过编辑我的phpunit.xml 文件在测试中实现了预期的响应,结果证明该文件覆盖了我的.env.testing

删除这两行会得到预期的行为。

<server name="DB_CONNECTION" value="sqlite"/>
<server name="DB_DATABASE" value=":memory:"/>

允许我期望的.env.testing 给予:

DB_CONNECTION=mysql
DB_DATABASE=subscribe_test

但是我不明白为什么这会在 SQLLite 上失败?特别是当用于比较 ID 的值都转储预期值时。

【讨论】:

  • 好吧,这实际上也为我解决了这个问题,但我不明白为什么这只发生在 Sqlite 上。现在我的测试速度变慢了。
【解决方案2】:

所以问题是 SQLite 返回 $user->id 作为整数和 $product->user_id 作为字符串。

请看这里:https://github.com/laravel/framework/issues/3548

【讨论】:

    猜你喜欢
    • 2021-12-30
    • 2021-12-13
    • 2016-05-03
    • 2020-03-26
    • 2013-06-20
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多