source

조롱하는 모멘트()와 모멘트().형식은 joke를 사용합니다.

manysource 2023. 3. 6. 21:17

조롱하는 모멘트()와 모멘트().형식은 joke를 사용합니다.

나는 조롱할 수 없다.moment()또는moment().format기능들.제 주(州)에는currentDateMoment그리고.currentDateFormatted아래와 같이 설정되어 있습니다.

currentDateMoment: moment() //2019-04-23T17:45:26.339Z
currentDateFormatted: moment().format('MM-DD-YYYY').valueOf() //"04-23-2019"

둘 다 비웃으려고 해moment()그리고.moment().format스냅숏 테스트에서 특정 날짜를 반환했지만 반환할 수 없었습니다.아래에서 시도했다.

jest.mock('moment', () => () => '2018–01–30T12:34:56+00:00');

jest.mock('moment', () => ({
  constructor: () => '2018–01–30T12:34:56+00:00'
})); 

jest.mock('moment', () => () => ({ format: () => '01–30-2018' }));

모멘트() 및 사용하는 함수를 가장 쉽게 모의할 수 있습니다(예:.day(),.format())를 변경한다.Date그거moment()보닛 밑에서 사용하다

아래의 스니펫을 테스트 파일 안에 추가합니다.

Date.now = jest.fn(() => new Date("2020-05-13T12:33:37.000Z"));

이 때문에 언제든지 그럴 수 있다.moment()검사에서 호출됩니다.moment()오늘이 2020년 5월 13일 수요일이라고 생각한다.

특정 날짜를 반환하기 위해 모멘트를 조롱할 수 있습니다.format비웃을 필요 없어

jest.mock('moment', () => {
  return () => jest.requireActual('moment')('2020-01-01T00:00:00.000Z');
});

그렇게 함으로써, 에의 문의가 있으면,Moment()는 항상 날짜가 2020-01-01 00:00:00:00로 설정된 모멘트 객체를 반환합니다.

다음은 내일 날짜 및 이 함수에 대한 테스트를 반환하는 함수의 예입니다.

const moment = require('moment');
const tomorrow = () => {
  const now = moment();
  return now.add(1, 'days');
};

describe('tomorrow', () => {
  it('should return the next day in a specific format', () => {
    const date = tomorrow().format('YYYY-MM-DD');
    expect(date).toEqual('2020-01-02');
  });
});

해결책은 다음과 같습니다.

index.ts:

import moment from 'moment';

export function main() {
  return {
    currentDateMoment: moment().format(),
    currentDateFormatted: moment()
      .format('MM-DD-YYYY')
      .valueOf()
  };
}

index.spec.ts:

import { main } from './';
import moment from 'moment';

jest.mock('moment', () => {
  const mMoment = {
    format: jest.fn().mockReturnThis(),
    valueOf: jest.fn()
  };
  return jest.fn(() => mMoment);
});

describe('main', () => {
  test('should mock moment() and moment().format() correctly ', () => {
    (moment().format as jest.MockedFunction<any>)
      .mockReturnValueOnce('2018–01–30T12:34:56+00:00')
      .mockReturnValueOnce('01–30-2018');
    expect(jest.isMockFunction(moment)).toBeTruthy();
    expect(jest.isMockFunction(moment().format)).toBeTruthy();
    const actualValue = main();
    expect(actualValue).toEqual({ currentDateMoment: '2018–01–30T12:34:56+00:00', currentDateFormatted: '01–30-2018' });
  });
});

100% 적용 범위에서의 유닛 테스트 결과:

 PASS  src/stackoverflow/55838798/index.spec.ts
  main
    ✓ should mock moment() and moment().format() correctly  (7ms)

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |      100 |      100 |      100 |      100 |                   |
 index.ts |      100 |      100 |      100 |      100 |                   |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        3.795s, estimated 8s

소스 코드: https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/55838798

는 모크데이트가 좋다.

import mockDate from "mockdate";


test('Should add some', () => {
    mockDate.set(new Date('2/20/2020'));

    const action = addSome();

    expect(action).toEqual({
        createdAt: moment()
    });

    mockDate.reset();
})

다른 답은 순간을 조롱하는 방법을 알려주지만 코드를 테스트하기 위해 순간을 조롱할 필요는 없습니다.실제로는 사용하지 않는 복잡한 서드파티제 인터페이스로, 테스트의 조합이 되어 버리기 때문에, 동작이 아니고 실장을 테스트하게 됩니다.

전화하는 대신moment()인수 없이 현재 날짜로 호출합니다(https://momentjscom.readthedocs.io/en/latest/moment/01-parsing/01-now/ 참조). moment()기본적으로는moment(new Date())현재 날짜는 사용자가 소유하고 있는 기능에서 가져옵니다.

const { getCurrentDate } = require('path/to/utils');

export const createSomething =() => ({
  currentDateMoment: moment(getCurrentDate()),
  currentDateFormatted: moment(getCurrentDate()).format('MM-DD-YYYY'),
});

테스트에서 충분히 조롱할 수 있습니다.

const { createSomething } = require('path/to/impl');
const { getCurrentDate } = require('path/to/utils');
jest.mock('path/to/utils');

it('formats the data correctly', () => {
  getCurrentDate.mockReturnValue(new Date(2021, 3, 29));

  const { currentDateFormatted } = createSomething();
  expect(currentDateFormatted).toEqual('2021-04-29');
});

이제 테스트는 구현 세부 사항이 된 순간을 전혀 참조하지 않습니다.만약 API가 미래에 변화한다면, 당신은 그것을 알게 될 것이다. 왜냐하면 당신의 테스트는 실패할 것이기 때문이다. 만약 그것이 조롱당한다면 오해의 소지가 있기 때문이다.다른 라이브러리로 전환하려면 테스트를 통해 동작이 여전히 올바르다는 것을 확신할 수 있습니다(다음 예에서는 DayJS에서 동일한 작업을 수행하는 방법을 보여 줍니다).

목하Moment().format(),startOf(),isValid()또는isAfter()기타. 아래의 예를 참조할 수 있습니다.

jest.mock('moment', () => {
    
    const momentParams = {
        format: jest.fn(() => '10/04/2020'),
        startOf: jest.fn().mockReturnThis(),
        isAfter: jest.fn().mockReturnValue(true),
        isValid: jest.fn().mockReturnValue(true)
    };

   const fn = jest.fn(newMoment => {
        momentParams.format = jest.fn(() => newMoment);
        return momentParams;
   });

   return fn;
});

그리고 마지막으로 이렇게 테스트 케이스를 작성할 수 있습니다.예:

 test('should returned mocked value for isAfter()', async () => {
    jest.spyOn(moment(), 'isAfter').mockReturnValue(false);
    const response = moment().isAfter();
    expect(response).toBe(false)
})

TL;DR 농담으로 테스트의 순간을 발견하여 솔루션에 큰 도움이 되었습니다.

콘텍스트는 모멘트 타임존을 사용한 포맷을 시뮬레이션해야 했습니다.이것이 저의 해결책입니다만, 다음과 같은 문제에 부딪혔습니다.moment,format 기타 .moment이치노

솔루션

// mock the module using automock from jest
jest.mock('moment-timezone', () => {
    // mocking a module requires the function definitions, to only partially mock, use requireActual 

    const moment = jest.requireActual('moment-timezone');
    // create a momentInstance
    const momentInstance = moment();

    // Override the format function with some mockedTime
    jest.spyOn(momentInstance, 'format').mockImplementation(() => mockedTime);

    function fakeMoment() {
        return momentInstance;
    }

    Object.assign(fakeMoment, moment);

    return fakeMoment;
});

저도 모멘트 타임존을 사용하고 있었기 때문에 아직 오류가 발생하고 있었습니다.이 문제를 해결하기 위해 제가 한 일은 다음과 같습니다.

let diffMins = updateThreshold + 1;
jest.mock('moment', () => {
  const mMoment = {
    diff: jest.fn(() => diffMins),
  };
  const fn = jest.fn(() => mMoment);
  fn.version = '2.24';
  fn.tz = jest.fn();
  fn.fn = jest.fn();
  return fn;
});

언급URL : https://stackoverflow.com/questions/55838798/mocking-moment-and-moment-format-using-jest