首页 > 解决方案 > 为什么仅在 PHPUnit 测试中禁止返回请求?

问题描述

我在 Laravel 6 项目中的测试类有问题。以下测试失败,因为返回的响应403 forbidden不是视图。但是,我只能在测试中重现这一点 - 在主应用程序中它按预期返回视图。有没有人经历过类似的事情或可以在下面看到任何明显错误的事情?

产品测试.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

产品控制器.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;
}

测试.env

//identical to .env apart from
TELESCOPE_ENABLED=false
DB_DATABASE=subscribe_test

路线/web.php

Route::get('/manage/products/{product}','ProductController@show')->middleware('auth')->name('show_product');

我已经清除了所有缓存,但没有任何效果。该资源在 PHPUnit 测试中返回 403,在应用程序中返回 200。缺少什么?

标签: phplaravelphpunit

解决方案


通过编辑我的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 的值都转储预期值时。


推荐阅读