ECMA Script6(JavaScript)でDate.now()、new Date()をモックする
ECMA Script6(JavaScript)のテストをしている時にDate.now()をある特定の時間にしたい時がありました。
Date.now()は現在時間のミリ秒を返すので、ある日時からの秒数に指定しないとテストが今はOKでも後々NGになる可能性があるためです。
sinonでもできますが、sinonを使わなくても以下のように記述するとモックすることができます。
Date.now = () => { return new Date('1970-01-01 09:00:00').getTime(); } console.log(Date.now());
結果は期待とおりの0です。
new Date()をモックする
sinon.useFakeTimers()メソッドを使うと時間を変えることができました。
useFakeTimers()の引数にミリ秒を指定してあげます。
mochaのbeforeやbeforeEach内で時間を変更してあげて、afterやafterEachでrestoreメソッドで戻してあげたら良いと思います。
以下記述例です。
const chai = require('chai'); const sinon = require('sinon'); const assert = chai.assert; var myFunc = function(a, b){ return a + b; }; describe('', function () { let now = new Date('1970-01-01 09:00:00');// ここで特定の時間を指定しておく let clock; beforeEach(function(done){ clock = sinon.useFakeTimers(now.getTime());// ミリ秒をセット done(); }); it('myFuncのテスト1', function(){ let dt = new Date(); console.log('date=',dt); // 時間確認しているだけ assert.strictEqual(myFunc(1, 2), 3); }); afterEach(function(done){ clock.restore();// これで時間が正常に戻る done(); }); });
コンソールの出力結果は以下のようになり、時間が変更されていることが確認できます。
C:\Users\xxxx\Documents\vscode\apps>mocha index.js date= 1970-01-01T00:00:00.000Z √ myFuncのテスト1 1 passing (81ms)
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント