Jest: 日付の珟圚の時刻をあざける

䜜成日 2016幎12月06日  Â·  72コメント  Â·  ゜ヌス: facebook/jest

@SimenBによるhttps 

珟圚の日付をモックする方法はありたすか new Date()たたはDate.now()が珟圚の時刻ではなく、モックされた時刻を返すようにするには

最も参考になるコメント

これで゚ラヌが発生した他の人にずっおは、グロヌバル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;

党おのコメント72件

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で珟圚の日付を

究極の解決策 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()含たれおいたす。_

2020幎11月からの曎新

_このスレッドが叀くなり、人気のあるスタックオヌバヌフロヌの投皿にリンクされおいるので、^それを倪字にしたす_

@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()曎新しお、このスレッドを芋぀けた人の正気が維持されるようにしたす。 ありがずう

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡