2015-10-27 21 views
7

私のアプリケーションでは、date/timeにmoment.jsを使用していますが、Jasmineのモック機能ではうまく動作しないようです。私は問題を示す以下のテストスイートをまとめました:Dateの場合はうまく動作しますが、jasmine dateモーフィング(moment.js)

jasmine.clock().mockDateのように動作していないようです。

describe('Jasmine tests', function() { 
    beforeEach(function() { 
     jasmine.clock().install(); 
    }); 

    afterEach(function() { 
     jasmine.clock().uninstall(); 
    }); 

    // Pass 
    it('uses the mocked time with Date', function() { 
     var today = new Date('2015-10-19'); 
     jasmine.clock().mockDate(today); 
     expect(new Date().valueOf()).toEqual(today.valueOf()); 
    }); 


    // Fail 
    it('uses the mocked time with moment', function() { 
     var today = moment('2015-10-19'); 
     jasmine.clock().mockDate(today); 

     expect(moment().valueOf()).toEqual(today.valueOf()); 
    }); 
}); 

momentにはないながら、期待通りになぜDate動作しますか?フードの下にDateを使用してmomentはありませんか?

ヤスミンを使用してmomentをモックする正しい方法は何ですか?

答えて

19

jasmine.clock().mockDateは、入力としてDateを想定しています。 Datemomentは完全に互換性がありません。仕様自体に嘲笑される予定の日付を指定する場合は、その代わりにDateを使用することができます。

あなたのコードが模擬したいとき、またはむしろモーメントAPIを使用する場合は、moment.toDate()を見てください。このメソッドは、Dateオブジェクトを返します。

it('uses the mocked time with moment', function() { 
    var today = moment('2015-10-19').toDate(); 
    jasmine.clock().mockDate(today); 
    expect(moment().valueOf()).toEqual(today.valueOf()); 
}); 
+3

重要なメモ - テスト後の嘲笑された日付をリセットすることを忘れないでください! 'jasmine.clock()。mockDate(..)'を呼び出すAFAIKはグローバルアクションですので、代わりに別の 'beforeEach'ブロックに設定(および設定解除)することをお勧めします。その後、 'afterEach'ブロックで' jasmine.clock()。uninstall() 'を使って後で消去してください。 –