2017-02-28 15 views
0

はのは、私はジャスミンを使用して時間をテストする良い方法だろうどのような二つの機能ジャスミンを使用して日付関数をテストする効率的な方法は何ですか?

var now = new Date(); 
var oneDayAgo = now.getTime() - (24 * 60 * 60 * 1000); 
var beforeOneDay = []; 
var otherEvents = []; 

var assignTimeSlots = function(time) { 

    if (time < oneDayAgo) 
     beforeOneDay.push(time) 
    else 
     otherEvents.push(time) 

} 

を持っているとしましょうか?

+0

可能な複製(http://stackoverflow.com/質問/ 26152796/mock-date-constructor-with-jasmine) – mikeapr4

答えて

0

あなたのチャレンジ

私はあなたのassignTimeSlots機能をテストしている中、本当に興味を持っているものを想定しています。あなたが挑戦しているのは、関数の外で定義された変数oneDayAgoに依存しているということです。これは、テストが実行され、コードがそのグローバルフィールドに依存していることを意味します。特にテストが実行されるたびに変更される現在の時刻を使用している場合は、困難になります。

依存性注入

あなたは、引数として関数にその変数を注入することによって、この問題を回避を得ることができます。これにより、テスト中の現在の時刻を制御することができます。あなたはもはやシステムクロックに結合されません。

[ジャスミンとモック日付コンストラクタ]の以下のテストされていないが、全体のポイントを取得する必要があります...

var assignTimeSlots = function(oneDayAgo, time) { 
    if (time < oneDayAgo) 
    beforeOneDay.push(time) 
    else 
    otherEvents.push(time) 
} 

it ('should be added to "beforeOneDay" if it is prior to yesterday', function() { 
    var oneDayAgo = new Date(2017, 1, 27, 13, 35); 
    var now = new Date(2017, 1, 28, 13, 36); 
    assignTimeSlots(now, oneDayAgo); 
    expect(beforeOneDay[0]).toBe(now); 
    expect(otherEvents.length).toBe(0); 
}); 
+0

hmm ...どのような日付が関数で動作することを保証するために、テストケースで時間をハードコードするだけではありませんか? –

+0

2つの異なるoneDayAgo値で2回呼び出します。 –

+0

ですが、テストケースを実行するたびにテストケースを変更する必要があることを意味します。 'oneDayAgo'は現在の時間に依存しているので、テストで日付をハードコードすると、テストは数週間後には役に立たないでしょう。 –

関連する問題