programing

날짜 개체를 사용하는 구성 요소는 시간대별로 서로 다른 스냅샷을 생성합니다.

newnotes 2023. 3. 1. 11:29
반응형

날짜 개체를 사용하는 구성 요소는 시간대별로 서로 다른 스냅샷을 생성합니다.

효소와 효소를 함께 사용해서 반응성분의 제스트 스냅숏 테스트를 하고 있습니다.얄팍한 스냅숏을 테스트하고 있습니다.DateRange표시 필드를 현재 범위로 렌더링하는 구성요소(예:5/20/2016 - 7/18/2016)와 2DateInput를 선택할 수 있는 컴포넌트Date즉, 내 스냅샷에 이 정보가 포함되어 있습니다.Dates 양쪽의 컴포넌트에 전달합니다.DateInput소품 및 텍스트 표현에서는 자동으로 해결됩니다.테스트에서 다음 항목을 사용하여 몇 가지 고정된 날짜를 만들고 있습니다.new Date(1995, 4, 23).

다른 타임존에서 테스트를 실행하면 다른 스냅샷이 생성됩니다.Date(year, month, ...)컨스트럭터는 로컬 시간대에 날짜를 만듭니다.예: 의 사용new Date()로컬 시간대 실행과 CI 서버 실행 간에 스냅샷의 차이가 발생합니다.

- value={1995-05-22T22:00:00.000Z}
+ value={1995-05-23T00:00:00.000Z}

날짜에서 시간대 오프셋을 제거하려고 했지만, 로컬 시간대 의존 표현이 사용되는 표시 필드 값이 스냅샷에 다르게 표시되었습니다.

- value={5/20/2016 - 7/18/2016}
+ value={5/19/2016 - 7/17/2016}

어떻게 하면 테스트 결과를 동일하게 만들 수 있을까요?Date실행 시간대에 관계없이 스냅샷에 저장됩니까?

몇 시간 또는 며칠 동안 이것과 씨름했지만, 이것만이 효과가 있었습니다.

1) 테스트 시:

Date.now = jest.fn(() => new Date(Date.UTC(2017, 7, 9, 8)).valueOf())

2) 다음으로,TZ테스트를 실행하기 전에 env var를 참조하십시오.그래서 내 패키지에 있는 스크립트.json:

  • (MacLinux만 해당)

    "test": "TZ=America/New_York react-scripts test --env=jsdom",
    
  • (Windows)

    "test": "set TZ=America/New_York && react-scripts test --env=jsdom",
    

나는 결국 두 부분으로 구성된 해결책을 얻게 되었다.

  1. 작성 안 함Date타임존 의존적인 방법으로 테스트 중인 객체.타임스탬프를 직접 사용하여 테스트 코드를 판독하지 않으려면Date.UTC,예.

    new Date(Date.UTC(1995, 4, 23))
    
  2. 회전하는 데 사용된 날짜 형식 지정기 모킹Date를 표시값으로 변환하여 타임존에 의존하지 않는 표현(예: 사용)을 반환합니다.Date::toISOString()다행히 현지화 모듈의 기능을 조롱하기만 하면 되기 때문에 제 경우작업은 쉬웠습니다. 컴포넌트가 스스로 문자열로 바뀌면 더 어려워질 수 있습니다.

위의 솔루션에 도달하기 전에 스냅샷 작성 방법을 어떻게든 변경하려고 했습니다.못생겼죠 왜냐면 효소-대-대-대-대-대-대-대-대-대-손이toISOString(), 그래서 나는 그것을 사용해야만 했습니다._.cloneDeepWith모든 수정이 가능합니다.Dates. 어쨌든 잘 되지 않았다.왜냐하면 내 테스트에는 다음 케이스도 포함되어 있었기 때문이다.Date타임스탬프(위 설명보다 컴포넌트가 훨씬 복잡함) 및 타임스탬프와 테스트에서 작성한 날짜 사이의 상호작용을 명시적으로 확인할 수 있습니다.그래서 처음에는 모든 날짜 정의가 같은 시간대를 가리키고 있는지 확인해야 했고, 나머지는 같은 시간대를 가리키고 있는지 확인해야 했습니다.


(2017년 11월 3일) :★★★★★를 확인했을 때enzyme-to-json들어서는 수 .toISOString()이제 더 이상 문제가 되지 않고 조롱당할 수도 있습니다.역사에서도 찾을 수 없었기 때문에 어느 도서관이 잘못 기재한 것일지도 모릅니다. 시험해 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ :)

i를 해서 이렇게 요.timezone-mock 「전역적인 것」을 대신합니다.Date제가 찾을 수 있는 가장 쉬운 해결책입니다.

이 패키지는 몇 가지 테스트 시간대를 지원합니다.

import timezoneMock from 'timezone-mock';

describe('when in PT timezone', () => {
  beforeAll(() => {
    timezoneMock.register('US/Pacific');
  });

  afterAll(() => {
    timezoneMock.unregister();
  });

  // ...

https://www.npmjs.com/package/timezone-mock

는 결국 이 .toLocaleString('ToString'으로) 'ToString'입니다.「」를 사용합니다.sinon가 했어 는는:::::

var toLocaleString;

beforeAll(() => {
    toLocaleString = sinon.stub(Date.prototype, 'toLocaleString', () => 'fake time')
})

afterAll(() => {
    toLocaleString.restore()
})

'아까부터 을 직접 할 수 .Date브젝,,넌넌 넌직찮찮아아

나에게 맞는 2020년 솔루션

beforeEach(() => {
        jest.useFakeTimers('modern');
        jest.setSystemTime(Date.parse(FIXED_SYSTEM_TIME));
});

afterEach(() => {
        jest.useRealTimers();
});

★★★★★★★★★를 사용하고 있는 경우는new Date()를 사용하면 할 수 : Date.가 아닌 컨스트럭터에서는 다음과 같은 작업을 수행할 수 있습니다.

const RealDate = Date;

beforeEach(() => {
  // @ts-ignore
  global.Date = class extends RealDate {
    constructor() {
      super();
      return new RealDate("2016");
    }
  };
})
afterEach(() => {
  global.Date = RealDate;
});

이 이슈는 당신이 여기 있다면 꼭 방문해야 합니다.

" " " TZ=UTC 나 my my my.env이치노

간단한 사실만으로도 쉽게 할 수 있다.

사용방법:

new Date('some string'). 

이렇게 하면 항상 유효하지 않은 날짜가 지정되며, 어떤 기계에 있든 항상 유효하지 않은 날짜가 지정됩니다.

건배.

새로운 날짜(1466424490000)와 같은 임의의 날짜를 새로운 날짜()로 호출할 수 있습니다.

언급URL : https://stackoverflow.com/questions/40935886/components-using-date-objects-produce-different-snapshots-in-different-timezones

반응형