Date.now = jest.fn
ãŸãã¯global.Date = jest.fn()
ã
ããã§ãšã©ãŒãçºçããä»ã®äººã«ãšã£ãŠã¯ãã°ããŒãã«Dateãªããžã§ã¯ãã«ã³ã³ã¹ãã©ã¯ã¿ãŒä»¥å€ã®ããããã£ããããããããã€ãã®åé¡ãçºçããŸããã ç§ã¯æ¬¡ã®ããšãããŸããïŒ
const DATE_TO_USE = new Date('2016');
const _Date = Date;
global.Date = jest.fn(() => DATE_TO_USE);
global.Date.UTC = _Date.UTC;
global.Date.parse = _Date.parse;
global.Date.now = _Date.now;
ã³ã³ã¹ãã©ã¯ã¿ãŒãã©ã®ããã«åŒã³åºãããŠããããè¡šæããå¿ èŠããªãå Žåã¯ãæ¡åŒµããã ãã§ååã§ãã
const constantDate = new Date('2017-06-13T04:41:20')
/*eslint no-global-assign:off*/
Date = class extends Date {
constructor() {
return constantDate
}
}
ããã¯Date.now()
ããªãããŸãæ©èœããŸãã
const now = Date.now()
Date.now = jest.genMockFunction().mockReturnValue(now)
æ¥ä»ãã¢ãã¯ãããšãã¯ãã€ã§ããå®éã®ããŒãžã§ã³ãå
ã«æ»ãããšãå¿ããªãã§ãã ããã
@callemoã³ã¡ã³ãã«ç¶ããŠã次ã®ã¹ããããã䜿çšã§ããŸãã
describe('getTimestamp', () => {
const RealDate = Date
function mockDate (isoDate) {
global.Date = class extends RealDate {
constructor () {
return new RealDate(isoDate)
}
}
}
afterEach(() => {
global.Date = RealDate
})
it('should return timestamp', () => {
mockDate('2017-11-25T12:34:56z')
expect(getTimestamp()).toEqual('20171125123456')
})
})
ééããªãã jest.runTimersToTime()
ããã®ä»ã®ã¿ã€ã ã¢ãã¯é¢æ°ãå®è¡ãããšãã¯ãæ¥ä»ãåã«ç§»åããå¿
èŠããããŸãã ã³ãŒãã®äžéšã¯æéã«äŸåããäžéšã¯ã¿ã€ã ã¢ãŠãã«äŸåããŠãããããåãåé¡ã«æ©ãŸãããŸããã äž¡æ¹ãåæã«ã¢ãã¯ãã-ã€ãŸããã¢ãã¯ã¿ã€ããŒãå®è¡ãã Date.now
ãšPerformance.now
ã¢ãã¯ãåãæ¿ããã®ã¯æé«ã®äœéšã§ã¯ãããŸããã
ãçµ±åããããã¿ã€ããŒã¢ãã¯ã®è§£æ±ºçã¯ã次ã®ããã«ã jest
ãã«ãã€ã³ã®ä»£ããã«lolex
ã䜿çšããããš
import lolex from 'lolex'
describe('tests', () => {
let clock
beforeEach(() => {clock = lolex.install()})
afterEach(() => {clock = clock.uninstall()})
test('garbage collects after keep alive', () => {
// ...
clock.tick(500)
// ...
})
})
ãããããã®æ©èœãçµã¿èŸŒãŸããŠãããšäŸ¿å©ã§ãã
å€ãåé¡ã§ããã mockdate
ãããç°¡åã«ãªããŸãïŒ https ïŒ
https://jasmine.github.io/2.2/introduction?spec=jasmine.any#section -Mocking_the_Date
describe("Mocking the Date object", function(){
it("mocks the Date object and sets it to a given time", function() {
var baseTime = new Date(2013, 9, 23);
jasmine.clock().mockDate(baseTime);
jasmine.clock().tick(50);
expect(new Date().getTime()).toEqual(baseTime.getTime() + 50);
});
});
@drpicoxã¯åªãããœãªã¥ãŒã·ã§ã³ã§ãããAFAIKã§ã¯performance.now()
ã¢ãã¯ããŸãããããã¯ã䟿å©ãªãã©ã¯ãŒãå°çšã¯ããã¯ã§ãïŒã€ãŸãããŠãŒã¶ãŒãã·ã¹ãã ã®DateTimeãå€æŽããŠãå
ã«æ»ãããŸããïŒã
å®éãJestã§ã¯æ©èœããŸããã Jestã¯Jasminev1.5.2-liteã䜿çšããŠãããããæèšããããŸããã lolex
ãŸãã
Date.now()
ã¯ã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã«ååã§ãã permofrmance.now()
ã¯ãŸã ããŒãã«ååšããŠããŸããïŒããšãã°ãSSRã§ã¯äœ¿çšã§ããŸããïŒããããã£ãŠã倧ããããšã§ã¯ãªãããã§ãã
ãã¡ãããlolexã¯jestãšçµ±åãããŠããŸããã
@drpicoxããããããæ©èœããªãããšãç¥ã£ãŠãããšããã§ãããã
performance.now()
ã¯ãv8.5.0以éãããŒãã«ååšãããšæããŸãã çµã¿èŸŒã¿ã¢ãžã¥ãŒã«'perf_hooks'
ããperformance
ãã€ã³ããŒãã§ããŸãã
ããã§ããçŸåšã®ç¶æ³ãšãããåŸãŠããæ祚/ã³ã¡ã³ãã®æ°ãèãããšããã®åé¡ãåéããããšãæ€èšããããã«@cpojerã«pingã
FWIWç§ã¯lolexãçµ±åãããã§ã-ããã¯ç§ãJestãããããªãŒãæ¬ ããŠãããšæããšããã§ç§ã䜿çšããå¯äžã®ã©ã€ãã©ãªã§ã
@cpojerãšã«ãããããåéã§ããŸãã ä»ã®ãšãããæ¬åœã«æ¥ä»ãåœããã³ç°¡åãªæ¹æ³ã§ãæéã®ãã¹ãã·ãã¥ã¬ãŒãããæ¹æ³ã¯ãããŸããã
ãžã£ã¹ãã³ã«ã¯ã次ã®æ¹æ³ã§æ¥ä»ãšæå»ãã¢ãã¯ã§ããæèšã¯ã©ã¹ããããŸãã
jasmine.clock().install(); //in a beforeEach
jasmine.clock().uninstall(); // in a AfterEach
jasmine.clock().mockDate(new Date('1984/12/15'));
// and very important... the pass of time!
jasmine.clock().tick(100);
åæ§ã®æ©èœããã€ãã£ãã«ããããšèããŠããŸãã https://github.com/jasmine/jasmine/blob/master/src/core/Clock.js
ãŠãŒã¹ã±ãŒã¹ããµããŒãããLolexãžã®ç§»è¡ãè©Šã¿ãŸãã ïŒ5165ãåç §
ãã¹ãç°å¢ã®_outside_ã§Dateãã¢ãã¯ããå¿ èŠãããå Žåã æ¥ä»ã衚瀺ãããUIã®äºæž¬å¯èœãªç»åã¹ãããã·ã§ãããæ®ãå¿ èŠããããŸããã
ããã¯ç§ã®ããã«åããïŒ
https://github.com/schickling/timemachine
timemachine.config({
dateString: 'December 25, 1991 13:12:59'
});
console.log(new Date()); // December 25, 1991 13:12:59
@omegdadiscã®ææ¡ã¯ç§ãæãã«æé«ã§ãã ïŒæåã®åçã§ææ¡ãããããã«ïŒåžžã«åãæ¥ä»ãè¿ãããã«æ¥ä»ãã¢ãã¯ãããšã new Date(2018, 2, 3)
ãããªãã®ãå°ç¡ãã«ãªããããç§ã«ã¯æå¹ãªãªãã·ã§ã³ã§ã¯ãããŸããã§ããã
ãŸããTravisãªã©ãã©ãã§ãå®å šã«æ©èœããŠåãçµæãçæããã«ã¯ãã¿ã€ã ãŸãŒã³ãæ£ç¢ºã«ããå¿ èŠãããããšã«æ³šæããŠãã ããã
timemachine.config({
dateString: 'December 25, 1991 13:12:59 GMT'
});
次ã®ãã¹ãã¹ã¿ãã¯ããã¹ãã©ã€ããµã€ã¯ã«äžã«å®æ°ãè¿ãæ¥ä»ã§ãã
let timeNow;
const realDate = Date;
describe("Stubbed Date", () => {
beforeAll(() => {
timeNow = Date.now();
const _GLOBAL: any = global;
_GLOBAL.Date = class {
public static now() {
return timeNow;
}
constructor() {
return timeNow;
}
public valueOf() {
return timeNow;
}
};
});
afterAll(() => {
global.Date = realDate;
});
it("provides constant timestamps", () => {
const ts1 = Date.now();
const ts2 = +new Date();
expect(ts1).toEqual(ts2);
expect(ts2).toEqual(timeNow);
});
});
_GLOBAL
ã¯ãtypescriptãæºããããã®åãªããããã·å€æ°ã§ãã
Date.now()
ãã¢ãã¯ããå¿
èŠããããŸãã
èšå®ã§ããŸãã¯ãã¹ããæ©èœããåã«ã以äžã®è¡ãèšå®ããŸãã
jest.spyOn(Date, 'now').mockImplementation(() => 1479427200000)
@vcarelã®ã¢ãããŒãã奜ã
describe('getTimestamp', () => {
const RealDate = Date
function mockDate (isoDate) {
global.Date = class extends RealDate {
constructor(...theArgs) {
if (theArgs.length) {
return new RealDate(...theArgs);
}
return new RealDate(isoDate);
}
static now() {
return new RealDate(isoDate).getTime();
}
}
}
afterEach(() => {
global.Date = RealDate
})
it('should return timestamp', () => {
mockDate('2017-11-25T12:34:56z')
expect(getTimestamp()).toEqual('20171125123456')
})
})
ç§ã¯ããã䜿çšããŠããŸããããã¯ç§ãæºè¶³ããŠããŸãïŒ https ïŒ
ç§ã¯ãããããŸãã
~~~
describeïŒ 'Test'ãïŒïŒ=> {
const constantDate = new DateïŒ '2018-01-01T12ïŒ00ïŒ00'ïŒ
beforeAllïŒïŒïŒ=> {
global.Date = class extends Date {
ã³ã³ã¹ãã©ã¯ã¿ãŒïŒïŒ{
çŽ æŽãããïŒïŒ
constantDateãè¿ããŸã
}
}
}ïŒ
~~~
@callemoãš@iwarnerã®çãã«å°ãè¿œå ããã®ãš
æ¯åæ°ããæ¥ä»ã€ã³ã¹ã¿ã³ã¹ãè¿ãããã次ã®ãããªããšãè¡ããšãšã©ãŒãçºçãã«ãããªããŸãã
const constantDate = new Date('2018-01-01T12:00:00')
beforeAll(() => {
global.Date = class extends Date {
constructor () {
super(constantDate.getTime())
}
}
})
ããã«ãããconstantDateãå€æŽããã«ãæ¥ä»ãªããžã§ã¯ãïŒsetMinutesãªã©ïŒãå€æŽããé¢æ°ã䜿çšã§ãããããæ°ããDateããè¿ãããæ¥ä»ãå€æŽã§ããŸãã
describe('Test', () => {
const constantDate = new Date('2018-01-01T12:00:00')
beforeAll(() => {
global.Date = class extends Date {
constructor () {
super()
return constantDate
}
}
});
it('it should not be possible to mutate the original date but it is.', () => {
const date1 = new Date();
date1.setMinutes(5);
const date2 = new Date();
console.log(date2.getMinutes()); // Will print 5
});
});
ããã¯ãäžèšã®ãã¹ãŠãèªãã åŸã«ç§ã䜿çšããŠãããã®ã§ãïŒ
let currentDate;
beforeAll(() => {
currentDate = new Date();
const RealDate = Date;
global.Date = jest.fn(() => new RealDate(currentDate.toISOString()));
Object.assign(Date, RealDate);
});
@samboylettããã¯ãå°æ¥ã®ãã¹ãã®ã°ããŒãã«ãªæ¥ä»ãå°ç¡ãã«ããŸããïŒ afterAll
é¢æ°ã§ããªã»ããããŸãããïŒ
ç°ãªããã¡ã€ã«ã®ãã¹ãã«ã¯åœ±é¿ããŸããã ç§ã«ãšã£ãŠãçŸåšã®ãã¡ã€ã«ã®ãã¹ãŠã«ã¢ãã¯æ¥ä»ãå¿ èŠã§ããããåããã¡ã€ã«ã®ãã¹ãéã§ãªã»ããããå¿ èŠãããå Žåã¯ãbeforeEachãšafterEachã䜿çšããafterEachã«æ»ãå¿ èŠããããŸãã
afterEach(() => {
global.Date = RealDate;
});
@samboylettããããšãïŒ ããªãã®äŸãããŒã¹ã«ããŠãæ¥ä»ãã¹ããæ©èœãããããšãã§ããŸããã
const myDate = new Date(2018, 6, 11);
const RealDate = Date;
describe('testcase', () => {
beforeEach(() => {
global.Date = jest.fn(
(...props) =>
props.length
? new RealDate(...props)
: new RealDate(myDate)
);
Object.assign(Date, RealDate);
});
afterEach(() => {
global.Date = RealDate;
});
});
ãã¶ãã jest-date-mockãå¿ èŠã§ãã
ãã¹ãã±ãŒã¹ã®çŸåšã®ã¿ã€ã ã¹ã¿ã³ããå¶åŸ¡ããããã®ã·ã³ãã«ãªAPIãæäŸããŸãã
import { advanceBy, advanceTo, clear } from 'jest-date-mock';
test('usage', () => {
advanceTo(new Date(2018, 5, 27, 0, 0, 0)); // reset to date time.
const now = Date.now();
advanceBy(3000); // advance time 3 seconds
expect(+new Date() - now).toBe(3000);
advanceBy(-1000); // advance time -1 second
expect(+new Date() - now).toBe(2000);
clear();
Date.now(); // will got current timestamp
});
äžèšã®è§£æ±ºçã¯ç§ã®ãŠãŒã¹ã±ãŒã¹ãã«ããŒããŠããŸããã§ããã instanceofã®ãµããŒãããªããç¹å®ã®æ¥ä»ãèšå®ããŠãã@callemoã«åºã¥ããŠã次ã®ããšãè¡ã
export function mockDate({year = 2017, month = 9, day = 16}) {
const globalDate = global.Date
global.Date = class MockDate extends Date {
constructor() {
super()
this.setFullYear(year)
this.setMonth(month)
this.setDate(day)
}
}
global.Date.mockRestore = () => global.Date = globalDate
}
@javadougããªãã®ã±ãŒã¹ã¯äœã§ããïŒ
@javadougããªãã®ã±ãŒã¹ã¯äœã§ããïŒ
@hustcc mockDate() instanceof Date === true
ã
@javadougã®æ°ããããŒãžã§ã³jest-date-mock
ãµããŒããããŠããŸãã https://github.com/hustcc/jest-date-mock/pull/7
ãç§ã¯ãã€ãæéãã¢ãã¯ããããã§ã¯ãããŸããããã¢ãã¯ãããšãã¯åè«ã§ãã-æªåé«ã@satub
new Date()
ãã¢ãã¯ããå¿
èŠããããŸããããéåžžã©ããã«æ©èœããã«ã¯ãæ®ãã®Date
æ©èœãå¿
èŠã§ããã ããã¯ç§ã®ããã«åãã解決çã§ãã
describe('...', () => {
const RealDate = Date;
function mockDate(isoDate) {
global.Date = class extends RealDate {
constructor(...args) {
if (args.length) return new RealDate(...args);
return new RealDate(isoDate);
}
};
}
afterEach(() => {
global.Date = RealDate;
});
it('...', () => {
mockDate('2018-01-01');
// rest of the code
});
})
global.Dateã«å²ãåœãŠãããšãããšãšã©ãŒãçºçããŸãïŒ
Error: Error: ReferenceError: Date is not defined
at Object.<anonymous>.exportObject.JUnitXmlReporter.self.specDone (/src/node_modules/jasmine-reporters/src/junit_reporter.js:274:33)
at dispatch (/src/node_modules/jest-jasmine2/build/jasmine/report_dispatcher.js:70:26)
at ReportDispatcher.specDone (/src/node_modules/jest-jasmine2/build/jasmine/report_dispatcher.js:62:247)
at Object.specResultCallback (/src/node_modules/jest-jasmine2/build/jasmine/Env.js:411:18)
at Spec.attr.resultCallback (/src/node_modules/jest-jasmine2/build/setup_jest_globals.js:67:24)
at complete (/src/node_modules/jest-jasmine2/build/jasmine/Spec.js:111:10)
at currentRun.then (/src/node_modules/jest-jasmine2/build/jasmine/Spec.js:107:30)
åé¡ã¯ããã¹ãã®ã³ã³ããã¹ãã§å®è¡ãããJUnitã¬ããŒã¿ãŒã䜿çšããŠããŠãå¿åã¯ã©ã¹ãç Žæ£ãããããã«æ¢ã«ç Žæ£ãããŠããDateã䜿çšããŠããããšã§ãã
ããã§ãããäžèšã®ãã¹ãŠã®ãããªææ¡ã䜿çšãããšãã°ããŒãã«ãªæ¥ä»ãå°ç¡ãã«ãªããŸãã ãããŠãããã¯ããªããéæšæºã®ã¬ããŒã¿ãŒã䜿ããšãã ãåé¡ã§ãã
ã¬ããŒã¿ãŒã¯ãµã³ãããã¯ã¹å ã§å®è¡ãããã¹ãã§ã¯ãããŸããã ãžã£ã¹ãã³ã®èšè ã¯ãæå³çã«ãµããŒããããŠããªããžã£ã¹ãã€ã ã®ãã®ã«å€¢äžã«ãªã£ãŠããå¯èœæ§ããããŸãã
ãããããªãã¯ãã®çš®ã®ã³ãŒãããµããŒããããŠããªããšèšã£ãŠããã®ã§ããïŒ
const jasmine = global.jasmine;
jasmine.getEnv().addReporter(junitReporter)
ããã§ãšã©ãŒãçºçããŸãïŒ
https://github.com/facebook/jest/blob/f9fd98fd4e38978e96a86f1c8796593cad7ac470/packages/jest-jasmine2/src/jasmine/ReportDispatcher.js#L63 -L72
æ£è§£ã§ãã䜿çšããå¿
èŠããããŸã
https://jestjs.io/docs/en/configuration#reporters-array-modulename-modulename-options ã
äŸïŒ https ïŒ
@niieani ã
ãçµ±åããããã¿ã€ããŒã¢ãã¯ã®è§£æ±ºçã¯ã次ã®ããã«ã
jest
ãã«ãã€ã³ã®ä»£ããã«lolex
ã䜿çšããããš
ç§ã¯ãã®äŸãè©ŠããŸãããããã®çµæããã¹ããæ°žä¹ ã«ãã³ã°ããŸããïŒ[email protected]ã䜿çšããŠããCRAã§ïŒã Jestã§lolexã䜿çšããŠæåãã人ã¯ããŸããïŒ
@kentcdoddsã¯ãjestã®åœã®ã¿ã€ããŒãåæã«äœ¿çšããªãããã«ããŠãã ããã ããã§ããã³ã°ããå Žåã¯ãè€è£œã§åé¡ãäœæããŠãã ããã Lolexã¯ééããªãæ©èœããã¯ãã§ã
ãããããã¯å€ç«ããç¶æ³ã§ç§ã«ãšã£ãŠã¯ããŸãæ©èœããŠããã®ã§ãç§ã¯ããããä»ã®å Žæã§å¥åŠãªããšãããŠããã§ãããã ããããšãïŒ
ãããã®ã±ãŒã¹ãã¢ãã¯ããã ãã§ããå ŽåïŒ
new Date()
new Date('2018-09-20T23:00:00Z')
const currentDate = new Date('2018-09-20T23:00:00Z');
Date = class extends Date {
constructor(date) {
if (date) {
return super(date);
}
return currentDate;
}
}
ããã¯ãäžèšã®ãã¹ãŠãèªãã åŸã«ç§ã䜿çšããŠãããã®ã§ãïŒ
let currentDate; beforeAll(() => { currentDate = new Date(); const RealDate = Date; global.Date = jest.fn(() => new RealDate(currentDate.toISOString())); Object.assign(Date, RealDate); });
ããããšã@samboylett
ããã¯ãæ°ããDateïŒïŒãã¢ãã¯ããã®ã«åœ¹ç«ã¡ãŸãã
@petromoldovanã¯ééããªãæè¯ã®çãã§ãã
ãã¹ãã®æåŸã«mockRestore
ãžã®åŒã³åºããè¿œå ããŠãå
ã®æ¥ä»ã埩å
ããŸãã
const dateNowMockFn = jest.spyOn(Date, 'now').mockImplementation(() => 1479427200000);
// ... code with tests
dateNowMockFn.mockRestore();
ã¢ãã¯ãæ°ããã¯ã©ã¹ã®1ã€ã§ã¯ãªãDateã€ã³ã¹ã¿ã³ã¹ãè¿ãããã«ãããå Žåã«åããŠã @ vcarelãœãªã¥ãŒã·ã§ã³ãå°ãæ¹åã
const RealDate = Date
const mockDate = (isoDate) => {
global.Date = class extends RealDate {
constructor () {
return super(isoDate)
}
}
}
afterEach(() => {
global.Date = RealDate
})
ç§ã¯ããã§é¢šè»ã«åŸããŠãããããããŸããããå€ãæ Œèšãææãã䟡å€ããããŸãïŒ
const myFunc = (msg, date = new Date()) => console.log(`${msg}! ${date}`);
çŸåšãæ¬çªã³ãŒãã§ã¯ãããã©ã«ããå©çšã§ããŸãã
myFunc("Hello"); // => Hello! Fri Mar 22 2019 21:11:26 GMT-0400 (EDT)
ãŸãããã¹ãã³ãŒãã§ã¯ãæ¥ä»ãæ瀺çã«æž¡ãããšãã§ããããããããããããããšãã§ããŸãã
myFunc("Hello", dateObj) // => Hello! ...
@yawaraminããã«ã¯ç¢ºãã«ããã€ãã®ç°ãªãèŠæ¹ããããŸãã ãã¹ãã¯ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã®ãµãŒãã¹ã§çããã¹ãã ãšä¿¡ããŠãããã£ã³ãããããå°Ÿãç¬ãæ¯ãå§ãããã€ã³ãããããŸãïŒããŒããã³ãã¯ããã«ã€ããŠããã€ãã®
ææ¡ãããæ¹æ³ãæå¹ãªãªãã·ã§ã³ã§ã¯ãªããšèšã£ãŠããã®ã§ã¯ãªããç¶æ³ã«å¿ããé©åãªæ¹æ³ãšããŠæ瀺ãããå¯èœæ§ããããŸãã
@cheapsteakç¶æ³ã®é©åæ§ãããã©ã«ãã®ç¶æ ã ãšæããŸãã ãã¹ã容ææ§ãæ¹åããæ©äŒã¯åžžã«ãããããããããšã§éåžžã¯ä¿å®æ§ãæ¹åãããããšã人ã ã«ç©ããã«æãåºãããããšã¯å®³ã«ã¯ãªããŸãã:-)
ã¿ã€ããŒããã£ã¹ãããããŠãããšãã«ãjestã®çŸåšã®æå»ãååŸããæ¹æ³ã¯ãããŸããïŒ jest.nowã®ãããªãã®ïŒ
ã¿ã€ããŒãšDate.nowïŒïŒã®åŒã³åºãããããšããŸãã jest.runAllTimersïŒïŒãåŒã³åºããŸãã ç§ã¯ïŒãä»ãæ¥ãïŒjest.spyOnãåŒã³åºãããšãã§ããã°ããã¯ã¯ãŒã«ã ãããmockImplementationïŒïŒïŒ=>äœãïŒã¿ã€ããŒã³ãŒã«ããã¯ãå®è¡ãããã·ãã¥ã¬ãŒããããæéã確èªããããšãã§ããããã«ã
Date.now()
ãã¢ãã¯ããå¿ èŠããããŸããèšå®ã§ããŸãã¯ãã¹ããæ©èœããåã«ã以äžã®è¡ãèšå®ããŸãã
jest.spyOn(Date, 'now').mockImplementation(() => 1479427200000)
ãããéåžžã«å€ãã®äººã ã«ãšã£ãŠã©ã®ããã«æ©èœãããã¯ããããã§ãããç§ã«ãšã£ãŠã¯ããã§ã¯ãããŸããã ããŒãã
äœãèµ·ãã£ãŠããã®ãããããŸãããã Date
ã©ã®ããã«åå²ãåœãŠããŠãã Date.now()
åžžã«ååšããåžžã«æå¹ãªå€ãè¿ããŸãã
Date.now = null
ã¯äœãããŸããã
global.Date.now = null
ã¯äœãããŸããã
jest.spyOn(Date, 'now').mockImplementation(() => 1479427200000);
ã¯äœãããŸããã
lolex
ã€ã³ã¹ããŒã«ãšäœ¿çšã¯ã¿ã€ã ã¢ãŠãã§æ©èœããŸããã Date.now()
ã¯åœ±é¿ããŸããã
MockDate
ã¯å¹æããããŸããã
æãããªäœããæ¬ ããŠãããšæããŸãã ãã¶ãå¥ã®äŸåé¢ä¿ãäœããããŠãã...ãšãŠãæ··ä¹±ããŠããã
@mherodevã¯ãã¹ãããã§ãã¯ããŸããããã¹ãé¢æ°ãå®è¡ããã/ã³ã³ããŒãã³ããã¬ã³ããªã³ã°ãããåã«æ¥ä»ãã¢ãã¯ããŸããïŒ
ãã¹ããããã¯å ã§ç§ã¯æ¬¡ã®ãããªããšãããŠããŸã...
Date.now = () => 1;
Date = null;
global.Date = null;
console.log(`Date.now()`, Date.now()); // Date.now() 1560239936091
ãããããã®ãªãŒããŒã©ã€ãã¯äœãããŸããã éåžžã«çŽãããããšæããŸãã
ç§ã¯Hugoã®ãã¥ãŒããªã¢ã«ã«åŸããæçµçã«æ¬¡ã®ããšãè¡ããŸããã
// @ts-ignore
.spyOn(global.Date, 'constructor')
.mockImplementationOnce(() => new Date('2019-06-19T00:07:19.309Z'))
ãããã£ãŠã new Date()
ã¯åžžã«new Date('2019-06-19T00:07:19.309Z')
è¿ããŸã
æŽæ°ïŒç§ã®ç°å¢ã§babelããã©ã³ã¹ãã€ã«ããæ¹æ³ã«ãã°ããããããDateã¢ãã¯ãæ©èœããŠããªãã£ãããã§ãã @babel/runtime-corejs2
䜿çšæ¹æ³ã«é¢é£ãããã®
究極ã®è§£æ±ºçïŒ jest-date-mock ã
jestã®äžã®package.jsonã§ãsetupFilesé åãäœæãããã®é åã«jest-date-mockãè¿œå ããŸãã
{
"jest": {
"setupFiles": ["./__setups__/other.js", "jest-date-mock"]
}
}
ãã¹ãã±ãŒã¹ã®çŸåšã®ã¿ã€ã ã¹ã¿ã³ããå¶åŸ¡ããããã®ã·ã³ãã«ãªAPIãæäŸããŸãã
import { advanceBy, advanceTo, clear } from 'jest-date-mock';
test('usage', () => {
advanceTo(new Date(2018, 5, 27, 0, 0, 0)); // reset to date time.
const now = Date.now();
advanceBy(3000); // advance time 3 seconds
expect(+new Date() - now).toBe(3000);
advanceBy(-1000); // advance time -1 second
expect(+new Date() - now).toBe(2000);
clear();
Date.now(); // will got current timestamp
});
ç§ã¯æãïŒä»ã®ãã¹ãŠã®è§£æ±ºçã¯äœç³»çã§ãäžæçã§ããªãã
ããã«å€æã¯ä»¥åã®åé¿çãç Žã£ãããã§ãã
ç§ã®è§£æ±ºçã¯ã setupMockDate.js
ãšããååã®æ°ãããã¡ã€ã«ãè¿œå ããããšã§ã
const mockDate = DateClass => {
function Mock(...args) {
return args.length === 0
? new DateClass(Mock.now())
: new DateClass(...args)
}
Object.setPrototypeOf(Mock, DateClass)
Mock.prototype = DateClass.prototype
let now
Mock.now = () => now === undefined ? DateClass.now() : now
Mock.mockNow = value => now = value
Mock.mockRestore = () => Mock.mockNow()
return Mock
}
global.Date = mockDate(Date)
setupFilesAfterEnv
ãšã³ããªã®jest.config.js
ïŒãŸãã¯å€ãjestããŒãžã§ã³ã§ã¯setupFiles
ïŒã«ã '<rootDir>/jest/setupMockDate.js'
è¿œå ããŸãã
ä»ãããªãã¯å®è¡ããããšãã§ããŸã
Date.mockNow(10)
expect(Date.now()).toBe(10)
Date.mockRestore()
expect(Date.now()).not.toBe(10)
Sinonã¯ç§ã«ãšã£ãŠããŸãæ©èœããŸãhttps://sinonjs.org/releases/v1.17.7/fake-timers/
ããŒãã£ãŒã«é ããŸããããjestã«ã¯ããã«å¿ èŠãªãã¹ãŠã®æ©èœããããšæããŸãã
describe('how to mock date.now()', function() {
beforeEach(() => {
this.timestamp = 0
global.Date.now = jest.fn().mockImplementation(() => this.timestamp)
})
afterEach(() => {
jest.clearAllMocks()
})
it('can advance in time', () => {
const then = Date.now()
this.timestamp += 1000
const now = Date.now()
expect(now - then).toBe(1000)
})
ç§ã¯vue-momentãšjestã䜿çšããŠããŸããã次ã®ãããªããšãè¡ãã®ãæåã®æ¹æ³ã§ããããšãããããŸããã
import { mount, createLocalVue } from '@vue/test-utils';
import TripList from 'components/trip-list.vue';
const localVue = createLocalVue();
localVue.use(require('vue-moment'));
describe('TripList', () => {
it('text shows current date', () => {
const myDate = new Date(2019, 5, 5);
const wrapper = mount(TripList, {
localVue,
});
wrapper.vm.$moment.now = () => myDate;
wrapper.vm.$forceUpdate();
expect(wrapper.html()).toContain('Thu, Oct 3rd');
});
})
ES6ã®äœ¿çš
const fixedDate = new Date('2019-03-1');
const RealDate = Date;
beforeEach(() => { Date.now = () => fixedDate; });
afterEach(() => { global.Date = RealDate; });
Date.now()
ã䜿çšããŠããå Žå
const dateSpy = jest.spyOn(Date, 'now');
dateSpy.mockReturnValue(TIMESTAMP);
ããã§ãšã©ãŒãçºçããä»ã®äººã«ãšã£ãŠã¯ãã°ããŒãã«Dateãªããžã§ã¯ãã«ã³ã³ã¹ãã©ã¯ã¿ãŒä»¥å€ã®ããããã£ããããããããã€ãã®åé¡ãçºçããŸããã ç§ã¯æ¬¡ã®ããšãããŸããïŒ
const DATE_TO_USE = new Date('2016'); const _Date = Date; global.Date = jest.fn(() => DATE_TO_USE); global.Date.UTC = _Date.UTC; global.Date.parse = _Date.parse; global.Date.now = _Date.now;
Dateã¯ã©ã¹å šäœãã¢ãã¯ãããã£ãã®ã§ã @ kristojorgã«ãã£ãŠææ¡ããã
ãããé©åãªæ¹æ³ãã©ããã¯ããããŸãããããã®ãœãªã¥ãŒã·ã§ã³ã¯ã æ£åžžã«æ©èœããŸãã
describe('Mock Date', () => {
const realDateNow = Date.bind(global.Date);
beforeAll(() => {
// Fix the time to 2020-1-1 1hr:1min:1sec in order to match
// snapshots for the DownloadConfirmDialog component.
const fixedDate = new Date(2020, 0, 1, 1, 1, 1);
const d = Date;
// This will only mock any Date objects instantiated with new
// and not Date.now().
const _global: NodeJS.Global = global;
_global.Date = jest.fn(() => fixedDate);
_global.Date.parse = d.parse;
_global.Date.UTC = d.UTC;
_global.Date.now = d.now;
});
it('shows mocked date', () => {
// Shows 2020-01-01T01:01:01.000Z as the current Date
// for an instantiated Date object.
console.log(new Date().toISOString());
});
afterAll(() => {
// Reverts to the current Date object.
global.Date = realDateNow;
console.log(new Date().toISOString());
});
});
ããã¯ãæ°ããDate
ãªããžã§ã¯ããã€ã³ã¹ã¿ã³ã¹åããå Žåã«ã®ã¿æ©èœãã Date.now()
ã§ã¯æ©èœããªãããšã«æ³šæããŠãã ããã Date.nowã«é¢ããã³ã¡ã³ãããããŸãã
ãã¹ããããã¯å ã§ç§ã¯æ¬¡ã®ãããªããšãããŠããŸã...
Date.now = () => 1; Date = null; global.Date = null; console.log(`Date.now()`, Date.now()); // Date.now() 1560239936091
ãããããã®ãªãŒããŒã©ã€ãã¯äœãããŸããã éåžžã«çŽãããããšæããŸãã
ç§ã¯åãåé¡ãæ±ããŠããŸãïŒãã®åé¡ã§èŠã€ãã£ãããããã®ã³ãŒãäŸããã¹ãããŸããããã©ããããŸããããŸããã§ããïŒã¢ãã¯ã¯ç¡èŠãããŠããããã§ãã
åé¡ãã©ã®ããã«ä¿®æ£ããŸãããïŒ
Babelã䜿çšããŠããã®ã§ããããé¢ä¿ããŠããå¯èœæ§ããããŸãã
ãã¹ããããã¯å ã§ç§ã¯æ¬¡ã®ãããªããšãããŠããŸã...
Date.now = () => 1; Date = null; global.Date = null; console.log(`Date.now()`, Date.now()); // Date.now() 1560239936091
ãããããã®ãªãŒããŒã©ã€ãã¯äœãããŸããã éåžžã«çŽãããããšæããŸãã
ç§ã¯åãåé¡ãæ±ããŠããŸãïŒãã®åé¡ã§èŠã€ãã£ãããããã®ã³ãŒãäŸããã¹ãããŸããããã©ããããŸããããŸããã§ããïŒã¢ãã¯ã¯ç¡èŠãããŠããããã§ãã
åé¡ãã©ã®ããã«ä¿®æ£ããŸãããïŒ
Babelã䜿çšããŠããã®ã§ããããé¢ä¿ããŠããå¯èœæ§ããããŸãã
@warpdesignãã®ãœãªã¥ãŒã·ã§ã³ã¯ãTypeScriptã®Jestã§æ©èœããããã§ãã
describe('Mock Date.now', () => {
// Bind to the original Date so we can set it back after all tests are finished.
const realDateNow = Date.now.bind(global.Date);
beforeAll(() => {
// Return 1 millisecond when calling Date.now() in tests.
const dateNowStub = jest.fn(() => 1);
global.Date.now = dateNowStub;
});
it('shows mocked date', () => {
console.log(Date.now()); // Returns 1.
});
afterAll(() => {
// Set back to the original Date object.
global.Date.now = realDateNow;
console.log(Date.now()); // Returns current time in milliseconds.
});
});
究極ã®è§£æ±ºçïŒ jest-date-mock ã
- ã€ã³ã¹ããŒã«
jestã®äžã®package.jsonã§ãsetupFilesé åãäœæãããã®é åã«jest-date-mockãè¿œå ããŸãã
{ "jest": { "setupFiles": ["./__setups__/other.js", "jest-date-mock"] } }
- å©çšæ¹æ³
ãã¹ãã±ãŒã¹ã®çŸåšã®ã¿ã€ã ã¹ã¿ã³ããå¶åŸ¡ããããã®ã·ã³ãã«ãªAPIãæäŸããŸãã
import { advanceBy, advanceTo, clear } from 'jest-date-mock'; test('usage', () => { advanceTo(new Date(2018, 5, 27, 0, 0, 0)); // reset to date time. const now = Date.now(); advanceBy(3000); // advance time 3 seconds expect(+new Date() - now).toBe(3000); advanceBy(-1000); // advance time -1 second expect(+new Date() - now).toBe(2000); clear(); Date.now(); // will got current timestamp });
ç§ã¯æãïŒä»ã®ãã¹ãŠã®è§£æ±ºçã¯äœç³»çã§ãäžæçã§ããªãã
ãããããé¡ãããŸã!!
ç§ã¯Hugoã®ãã¥ãŒããªã¢ã«ã«åŸããæçµçã«æ¬¡ã®ããšãè¡ããŸããã
// @ts-ignore .spyOn(global.Date, 'constructor') .mockImplementationOnce(() => new Date('2019-06-19T00:07:19.309Z'))
ãããã£ãŠã
new Date()
ã¯åžžã«new Date('2019-06-19T00:07:19.309Z')
è¿ããŸã
ãã®ç·ã¯äœã®ããããã§ãã Uã¯Hugoã®ãã¥ãŒããªã¢ã«ãèšããHugoã¯ããªãã®ãã¥ãŒããªã¢ã«ãèšããŸã....誀解ããªãã§ãã ããã
Jest 26ã¯ãææ°ã®åœã®ã¿ã€ããŒã䜿çšããDate
ã¢ãã¯ããµããŒãããŠããŸãïŒ https ïŒ//jestjs.io/blog/2020/05/05/jest-26#new -fake-timers
TSã§Dateã³ã³ã¹ãã©ã¯ã¿ãŒãã¢ãã¯ããããšããŠç«ã¡åŸçããŠããå Žåã¯ã次ã®ããšãè©ŠããŠãã ããã
const mockDate = new Date('Tue, 23 Jun 2020 14:34:56');
const RealDate = Date;
(global as any).Date = class extends RealDate {
constructor() {
super();
return mockDate;
}
};
// test some date related functionality
global.Date = RealDate;
Jest 26ã¯ãææ°ã®åœã®ã¿ã€ããŒã䜿çšãã
Date
ã¢ãã¯ããµããŒãããŠããŸãïŒ https ïŒ//jestjs.io/blog/2020/05/05/jest-26#new -fake-timers
@SimenBããã¯çŽ æŽãããããšã§ãv26ã«æŽæ°ããã°ããã§ãããjestã䜿çšããŠæ¥ä»ãã¢ãã¯ããæ¹æ³ãããããŸããã jestã®ããã¥ã¡ã³ãã§ã¯ãsetTimeOutããã¹ãã§ããããã«ã¿ã€ããŒãã¢ãã¯ããæ¹æ³ã«ã€ããŠã®ã¿èª¬æããŠããŸããããnew DateïŒïŒããã¢ãã¯ããæ¹æ³ã«ã€ããŠã¯ã©ãããã°ããã§ããããã
@gregveresããã¯ãã·ã¹ãã æå»ïŒ Date
ã¡ãœããïŒãåºå®æ¥ä»ã«èšå®ãããã®æå»ã®é²è¡ãåŠçãããã¹ãã¹ã€ãŒãã®äŸã§ãã
const FIXED_SYSTEM_TIME = '2020-11-18T00:00:00Z';
describe('Set Fixed Date', () => {
beforeEach(() => {
jest.useFakeTimers('modern');
jest.setSystemTime(Date.parse(FIXED_SYSTEM_TIME));
});
afterEach(() => {
jest.useRealTimers();
});
it('Should reflect fixed date', () => {
expect(new Date().toISOString()).toEqual(FIXED_SYSTEM_TIME);
const MS_TO_ADVANCE = 5000;
jest.advanceTimersByTime(MS_TO_ADVANCE);
expect(new Date().toISOString()).toEqual(new Date(Date.parse(FIXED_SYSTEM_TIME) + MS_TO_ADVANCE).toISOString());
});
});
_æŽæ°ïŒä»¥äžã®@alexdanilowiââczã®ã³ã¡ã³ãããšã«afterEach()
å«ãŸããŠããŸãã_
_ãã®ã¹ã¬ãããå€ããªãã人æ°ã®ããã¹ã¿ãã¯ãªãŒããŒãããŒã®æçš¿ã«ãªã³ã¯ãããŠããã®ã§ã^ããã倪åã«ããŸã_
@seansullivançŽ æŽãããïŒ åèãŸã§ã«ãééã£ãŠããå Žåã¯èšæ£ããŠãã ããããã ããä»æ§ã«afterEachïŒãŸãã¯afterAllïŒãè¿œå ããŠãæ¥ä»ãçŸå®ã«ãªã»ãããããšãããšæããŸãã å®å šã®ããã«ã
describe('Test', () => {
// to avoid race conditions between expected and actual date values
beforeAll(() => {
jest.useFakeTimers('modern'); // tell Jest to use a different timer implementation.
jest.setSystemTime(new Date('20 Aug 2020 00:12:00 GMT').getTime())
});
afterAll(() => {
// Back to reality...
jest.useRealTimers();
});
@alexdanilowiââczããŒãã§ã¯ãã ã¯ããäŸã«ã¯ãªãŒã³ã¢ãããå«ããããšãæ ããŸããã afterEach()
æŽæ°ããŠããã®ã¹ã¬ãããèŠã€ãã人ã®æ£æ°ãç¶æãããããã«ããŸãã ããããšãïŒ
æãåèã«ãªãã³ã¡ã³ã
ããã§ãšã©ãŒãçºçããä»ã®äººã«ãšã£ãŠã¯ãã°ããŒãã«Dateãªããžã§ã¯ãã«ã³ã³ã¹ãã©ã¯ã¿ãŒä»¥å€ã®ããããã£ããããããããã€ãã®åé¡ãçºçããŸããã ç§ã¯æ¬¡ã®ããšãããŸããïŒ