Cypress 종단 간 테스트에서 가짜 날짜를 사용하는 방법

8797 단어 cypresslaraveltesting

소개



종단 간 테스트(또는 브라우저 테스트라고 함)를 작성할 때 응용 프로그램이 특정(가짜) 날짜를 사용하도록 하는 것은 까다로울 수 있습니다. 이 게시물에서는 사용자 지정 미들웨어를 사용하여 응용 프로그램이 특정(가짜) 날짜에 있는 동안 Cypress 테스트를 작성할 수 있는 접근 방식을 공유합니다.

최근에 나는 Carbon::now() 특정(가짜) 날짜를 반환하기를 원하는 Laravel 프로젝트에 대한 Cypress 수락("종단 간") 테스트를 작성하고 싶었습니다. 내 브라우저 테스트의 날짜.

처음에는 Carbon::setTestNow() 만 설정할 수 있다고 생각했지만 이것은 단일 요청에서만 살아남을 수 있으며 이러한 테스트 내에서 여러 끝점에 대한 어설션을 만들기 위해 지정한 사용자 지정 날짜가 애플리케이션에 전역적으로 적용되기를 원했습니다.

몇 번의 온라인 검색 후 도움을 요청하기로 결정하고 새로운 아이디어를 촉발한 답장을 받았습니다. 아마도 미들웨어 💡를 사용할 수 있을 것입니다.

결국 다음 설정을 사용하게 되었습니다.

미들웨어 접근 방식



새 미들웨어 추가



먼저 SetTestDate 라는 새로운 미들웨어를 만들었습니다. 이 미들웨어를 '웹' 미들웨어 그룹 내에서 적용하고 싶지만 환경이 "로컬"(기본 개발 환경) 또는 "테스트"(.env.cypress의 환경)일 때만 적용됩니다.

먼저 아래 그림과 같이 boot()AppServiceProvider 메서드 내에서 'web' 그룹에 미들웨어를 조건부로 푸시해 보겠습니다.

// app/Providers/AppServiceProvider.php

use App\Http\Middleware\SetTestDate;
use Illuminate\Contracts\Http\Kernel;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        if ($this->app->environment(['local', 'testing'])) {
            $kernel = $this->app->make(Kernel::class);
            $kernel->appendMiddlewareToGroup('web', SetTestDate::class);
        }
    }
}
SetTestDate 미들웨어 내에서 특정 쿠키(이 예에서는 "set_test_date")가 지정된 (가짜) 날짜를 포함하도록 설정되어 있는지 확인하려고 합니다. 명확성과 일관성을 위해 이 쿠키의 이름을 클래스 상수TEST_DATE_COOKIE에 저장하겠습니다.

// app/Http/Middleware/SetTestDate.php

<?php

namespace App\Http\Middleware;

use Carbon\Carbon;
use Closure;

class SetTestDate
{
    const TEST_DATE_COOKIE = 'set_test_date';

    public function handle($request, Closure $next)
    {
        if ($this->wantsToSetTestDate($request)) {
            $this->setDateNow($request->cookie(self::TEST_DATE_COOKIE));
        }

        return $next($request);
    }

    private function setDateNow($date)
    {
        Carbon::setTestNow(Carbon::parse($date));
    }

    private function wantsToSetTestDate($request)
    {
        return $request->cookie(self::TEST_DATE_COOKIE) !== null;
    }
}

Cypress 테스트에서 사용자 지정(가짜) 날짜 설정



이제 미들웨어가 준비되었으므로 미들웨어에 정의한 요청 변수를 사용하여 가짜 날짜를 사용하는 경로를 방문할 수 있습니다.

it('shows the current date', () => {
    const date = 'tuesday 1 september 2020'
    cy.setCookie('set_test_date', date);

    cy.visit("/");

    cy.contains('Tuesday, September 1st 2020')
})

암호화된 쿠키



이 단계에서 테스트를 실행하면 요청에서 쿠키가 확인되지 않고 null 에 대해 $request->cookie('set_test_date')가 반환됩니다.

Laravel은 EncryptCookies 미들웨어로 인해 기본적으로 쿠키를 암호화하므로 set_test_date 쿠키에 대한 예외를 생성해야 합니다.

// app/Http/Middleware/EncryptCookies.php
class EncryptCookies extends Middleware
{
    protected $except = [
        'set_test_date'
    ];
}

결론



특정 쿠키 내에서 가짜 날짜를 허용하고 이 쿠키가 있는 각 요청에 대해 Carbon::setTestNow()를 호출하는 미들웨어를 사용하여 Laravel 종단 간 테스트에서 현재 날짜를 조작하는 것이 가능합니다.

Laravel 애플리케이션에서 Cypress를 사용할 때 laracasts/cypress 도우미 패키지를 확인하십시오.

Laravel 애플리케이션의 맥락에서 Cypress에 대해 자세히 알아보려면 Laracasts에서 this video series를 적극 권장합니다.

좋은 웹페이지 즐겨찾기