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时,它会创建一个新的cookie。当它确实有它时,我们只是转发请求链。

问题是在测试这个时。这是我正在做的事情:

namespace TestsFeature;
use TestsTestCase;
use IlluminateFoundationTestingWithFaker;
use IlluminateFoundationTestingRefreshDatabase;
use IlluminateFoundationTestingTestResponse;
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
@@ @@
 SymfonyComponentHttpFoundationCookie Object (
     'name' => 'guest'
-    'value' => 'eyJpdiI6IkttV2I2dldNelNkWXpyQXRWRUFlRUE9PSIsInZhbHVlIjoiQnBFYVlZNTNtYThjOWFxTTdLRXh4Zz09IiwibWFjIjoiZjY0NmEyNTMyMmM2MjJkNThmNmM5NWMxMDc2ZThmOTZjNDJhZTJjMmJhMGM0YTY0N2Q4NDg5YWEwNjI1ODEwZiJ9'
+    'value' => 'eyJpdiI6InRSMUVOSEZESm5xblwvOUU3aHQweGZ3PT0iLCJ2YWx1ZSI6ImhjU1lcL2pJUU1VbGxTN1BJQTdPWXBBPT0iLCJtYWMiOiJmM2QyYjQ3NzU5NWU5Nzk2Yjg0Yzg4MmFlNGFmYTdkNThlNjZhNzVhMjE3YjUxODhlNzRkMjA0MWQzZmEyODM2In0='
     'domain' => null
     'expire' => 0
     'path' => '/'

就像$this->get没有在同一环境中执行(?(,没有保留以前设置的cookie,并为每个调用创建唯一的调用和数据。这确实有意义,但是如果没有设置其他同名cookie,您将如何测试来宾cookie的创建?

尽管知道E2E测试和工具,但我不知道有像Laravel Dusk这样的东西,它解决了我的问题。

安装Laravel Dusk后,它会创建一个tests/Browser文件夹。

我只需要创建一个像GuestCookieTest.php这样的测试文件,其中包含以下内容:

<?php
namespace TestsBrowser;
use TestsDuskTestCase;
use LaravelDuskBrowser;
use IlluminateFoundationTestingDatabaseMigrations;
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);
        });
    }
}

绝对简单!

最新更新