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






Несмотря на то, что я знал о тестировании и инструментах 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);
});
}
}
Абсолютно просто!
Вы действительно правы, предполагая, что запросы, выполняемые методом
get(), выполняются индивидуально, и каждый запрос будет иметь свой собственный жизненный цикл, поэтому файлы cookie будут совершенно разными для каждого запроса. Это связано с тем, что методget()каждый раз запускает новый экземпляр ядра Laravel, как это делает Laravel вpublic/index.php, но в этом случае у вас нет части уравнения, связанной с браузером, которая отвечает за сохранение и отслеживание файлов cookie. Поэтому я предлагаю вам попробовать использовать Selenium для оценки ваших файлов cookie по запросам.