ECMA Script6(JavaScript)でDate.now()、new Date()をモックする

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です。

ECMA Script6(JavaScript)でDate.now()、new Date()をモックする

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)

参考サイト

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました