programing

공장 기능을 반환하는 es6 모듈(moment.js)을 조롱하는 행위

prostudy 2022. 4. 10. 21:21
반응형

공장 기능을 반환하는 es6 모듈(moment.js)을 조롱하는 행위

나는 Jest가 처음이라 곰이야.

나는 DateFilter라는 Jest를 사용하여 Vue2.js 필터를 테스트하려고 한다.이 필터는 단순히 날짜 형식을 전달된 날짜에 적용한다.

다테필터.js

import Vue from 'vue';
import moment from 'moment';

const dateFormatter = (dateValue, dateFormat) => {
    return moment(dateValue).format(dateFormat);
};

Vue.filter('date', dateFormatter);

export default dateFormatter;

그래서 여기 3개의 유효한 단위 테스트가 있다.

  1. DateFilter 모듈이 함수를 내보내야 함

  2. 날짜 필터는 dateValue가 전달된 날짜로 모멘트를 초기화해야 함

  3. 날짜 필터는 포맷이 통과된 날짜와 함께 즉시 포맷 방법을 호출해야 함

DateFilter.test.js

import moment from 'moment';
import DateFilter from './DateFilter';

describe('DateFilter', () => {
    it('should exist', () => {
        expect(DateFilter).toBeDefined();
        expect(typeof DateFilter).toBe('function');
    });

    it('should moment.format with the dateValue and dateFormat passed.', () => {
        // Here I get lost in how to spyOn moment function and the .format function
        const mockDateFormat = `dateFormat-${Math.random()}`;
        const mockDate = `mockDate-${Math.random()}`;
        jest.mock('moment', () => {
            return { format: jest.fn() }
        });
        // expect moment to have been called with mockDate
        // expect moment(mockDate) to have been called with mockDateFormat
    });
});

어떤 것을 얼마나 자세히 테스트하고 싶은지는 모르겠지만, 나는 그 비밀이 모멘트 j를 잘 조롱하는 것이라고 추측한다.dateFormatter만 테스트하려면 다음을 수행하십시오.

먼저 우리는 모의실험을 모멘트js로 설정했다.

jest.mock('moment', () => {
    const momentMock = { format: jest.fn() }

    return jest.fn(() => momentMock);
});

만약 당신이 const를 선언하는 대신, 당신은 그 대상을jest.fn당신은 아마도 그 기능이 호출되지 않았다는 오류를 얻게 될 것이다. 왜냐하면 우리는 우리가 모든 것에 대해 동일한 모의실험을 하는 대신에 매 순간을 부를 때마다 다른 모의실험을 만들 것이기 때문이다.moment전화를 걸다

이건 아주 간단한 거야, 좀 더 정교한 순간 모의실험을 할 수도 있겠지만, 네 기능은 간단하니까 그런 노력은 할 가치가 없다고 생각해.

그렇다면 단위 테스트를 분리해 놓은 것 같은데 한 번에 할 수도 있지만 어떤 때는 기능 사슬을 따로 주장하는 게 좋다.

it('calls moment with the dateValue passed.', () => {
    const mockDateFormat = `dateFormat-${Math.random()}`;
    const mockDate = `mockDate-${Math.random()}`;

    dateFormatter(mockDate, mockDateFormat);

    expect(moment).toHaveBeenCalledWith(mockDate)
});
it('calls format with the dateFormat passed.', () => {
    const mockDateFormat = `dateFormat-${Math.random()}`;
    const mockDate = `mockDate-${Math.random()}`;

    dateFormatter(mockDate, mockDateFormat);

    expect(moment(mockDate).format).toHaveBeenCalledWith(mockDateFormat)
});

고지 사항:두 번째 테스트에서는 기대해도 상관없다.moment(), moment(mockDate) or moment('Whatever')너는 항상 같은 것을 조롱하기 때문에 너는 같은 것을 받을 것이다.format조롱하여 되받아치다

좀 더 복잡한 것을 원할 경우, 모멘트j가 호출된 날짜를 모의 함수가 포함된 새로운 객체에 매핑하는 고정장치를 만들어야 한다.하지만 나는 이것이 더 번거로운 일이라고 믿고, 실제로 그 순간이 불렸고 형식이 불렸다는 것을 시험해 보는 것이 더 낫다고 생각한다.그렇지 않으면 당신은 제3자 라이브러리가 어떻게 작동하는지 많은 것을 테스트하고 있다.

이것이 당신에게 어떤 가이드라인을 주길 바란다.

참조URL: https://stackoverflow.com/questions/50956080/mocking-es6-module-returning-factory-function-moment-js

반응형