Почему возврат запросов запрещен только в тестировании PHPUnit? - PullRequest
0 голосов
/ 30 марта 2020

У меня проблема с тестовым классом в проекте 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

маршрутов / веб. php

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

Я очистил все кэши с помощью нет эффекта. Ресурс возвращает 403 в тестах PHPUnit и 200 в приложении. Чего не хватает?

1 Ответ

0 голосов
/ 30 марта 2020

Я получил ожидаемый ответ в тесте, отредактировав мой файл 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? Особенно, когда значения для сравнения идентификаторов сбрасывают ожидаемые значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...