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()をモックする

new Date()をモックしようと色々試みましたがsinonを使わないと私の能力では無理でした。

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)

参考サイト

スポンサーリンク
  • このエントリーをはてなブックマークに追加
スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA