공장 기능을 반환하는 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개의 유효한 단위 테스트가 있다.
DateFilter 모듈이 함수를 내보내야 함
날짜 필터는 dateValue가 전달된 날짜로 모멘트를 초기화해야 함
날짜 필터는 포맷이 통과된 날짜와 함께 즉시 포맷 방법을 호출해야 함
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
'programing' 카테고리의 다른 글
상태 Vuex/Vue/Nuxt에서 새 속성 개체를 추가하는 방법 (0) | 2022.04.10 |
---|---|
웹 팩 빌드 후 구성 값 변경 (0) | 2022.04.10 |
VueJS는 돔에서 특정 요소 선택 (0) | 2022.04.10 |
vuejs의 jquery css에 대한 대안 (0) | 2022.04.10 |
nuxtjs/pwa와 백그라운드 동기화를 구현하는 방법 (0) | 2022.04.10 |