Laravel — тестирование создания уникальных файлов cookie в промежуточном программном обеспечении

У меня есть промежуточное программное обеспечение, которое создает файлы cookie для гостевых пользователей, и я изо всех сил пытаюсь его протестировать. Это функция handle моего промежуточного программного обеспечения:


public function handle($request, Closure $next)
{
  $guestCookieKey = 'guest';

  if ($request->cookie($guestCookieKey)) {
    return $next($request);
  }

  return $next($request)->cookie($guestCookieKey, createGuestCookieId());
}

Проверка этого в браузере работает отлично: когда запрос не имеет этого файла cookie, он создает новый. Когда он есть, мы просто пересылаем цепочку запросов.

Проблема заключается в том, чтобы проверить это. Вот что я делаю:

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\TestResponse;

class GuestCookieTest extends TestCase
{
  public function testItCreatesOnlyOneCookiePerResponse()
  {
    $firstResponse = $this->get('/');
    $secondResponse = $this->get('/');

    $this->assertEquals(
      $firstResponse->headers->getCookies()[0],
      $secondResponse->headers->getCookies()[0]
    );
  }
}

Ошибка показывает различия между двумя значениями:

Failed asserting that two objects are equal.
--- Expected
+++ Actual
@@ @@
 Symfony\Component\HttpFoundation\Cookie Object (
     'name' => 'guest'
-    'value' => 'eyJpdiI6IkttV2I2dldNelNkWXpyQXRWRUFlRUE9PSIsInZhbHVlIjoiQnBFYVlZNTNtYThjOWFxTTdLRXh4Zz09IiwibWFjIjoiZjY0NmEyNTMyMmM2MjJkNThmNmM5NWMxMDc2ZThmOTZjNDJhZTJjMmJhMGM0YTY0N2Q4NDg5YWEwNjI1ODEwZiJ9'
+    'value' => 'eyJpdiI6InRSMUVOSEZESm5xblwvOUU3aHQweGZ3PT0iLCJ2YWx1ZSI6ImhjU1lcL2pJUU1VbGxTN1BJQTdPWXBBPT0iLCJtYWMiOiJmM2QyYjQ3NzU5NWU5Nzk2Yjg0Yzg4MmFlNGFmYTdkNThlNjZhNzVhMjE3YjUxODhlNzRkMjA0MWQzZmEyODM2In0='
     'domain' => null
     'expire' => 0
     'path' => '/'

Как будто $this->get не выполнялся в той же среде (?), не сохраняя установленные ранее файлы cookie и создавая уникальные вызовы и данные для каждого вызова. Это имеет смысл, но как бы вы проверили создание гостевого файла cookie, если другой файл cookie с таким же именем не установлен?

Вы действительно правы, предполагая, что запросы, выполняемые методом get(), выполняются индивидуально, и каждый запрос будет иметь свой собственный жизненный цикл, поэтому файлы cookie будут совершенно разными для каждого запроса. Это связано с тем, что метод get() каждый раз запускает новый экземпляр ядра Laravel, как это делает Laravel в public/index.php, но в этом случае у вас нет части уравнения, связанной с браузером, которая отвечает за сохранение и отслеживание файлов cookie. Поэтому я предлагаю вам попробовать использовать Selenium для оценки ваших файлов cookie по запросам.

Bogdan 23.06.2019 21:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
262
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Несмотря на то, что я знал о тестировании и инструментах E2E, я понятия не имел, что есть что-то вроде Ларавель Сумерки, которое решило бы мою проблему.

После установки Laravel Dusk создается папка tests/Browser.

Мне просто нужно было создать тестовый файл, например GuestCookieTest.php, со следующим содержимым:

<?php

namespace Tests\Browser;

use Tests\DuskTestCase;
use Laravel\Dusk\Browser;
use Illuminate\Foundation\Testing\DatabaseMigrations;

class GuestCookieTest extends DuskTestCase
{
    public function testItDoesNotOverwriteGuestCookieValue()
    {
        $this->browse(function (Browser $browser) {
            $firstCookieVal = $browser->visit('/')->cookie(config('guest'));
            $secondCookieVal = $browser->visit('/')->cookie(config('guest'));
            $this->assertEquals($firstCookieVal, $secondCookieVal);
        });
    }
}

Абсолютно просто!

Другие вопросы по теме