Laravel - тестирование создания уникальных файлов cookie в промежуточном программном обеспечении - PullRequest
1 голос
/ 23 июня 2019

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

1 Ответ

0 голосов
/ 26 июня 2019

Несмотря на то, что я знал о тестировании и инструментах E2E, я понятия не имел, что что-то вроде Laravel Dusk решило мою проблему.

После установки 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);
        });
    }
}

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

...