Cypress 종단 간 테스트에서 가짜 날짜를 사용하는 방법
소개
종단 간 테스트(또는 브라우저 테스트라고 함)를 작성할 때 응용 프로그램이 특정(가짜) 날짜를 사용하도록 하는 것은 까다로울 수 있습니다. 이 게시물에서는 사용자 지정 미들웨어를 사용하여 응용 프로그램이 특정(가짜) 날짜에 있는 동안 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를 적극 권장합니다.
Reference
이 문제에 관하여(Cypress 종단 간 테스트에서 가짜 날짜를 사용하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/johnbraun/how-to-use-fake-dates-in-cypress-end-to-end-testing-19h5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)