2016-12-14 8 views
12

単体テストを書くのが初めてで、関数の一部をテストするための助けが必要です。moment.jsを使った単体テスト

My機能は、このようになります

...

getData() { 
return this.parameters.map(p => { 
     return { 
      name: p.name, 
      items: p.items.map(item => { 

       const toTime = item.hasOwnProperty('end') ? moment.utc(item.end._d).unix() : null; 
       const fromTime = item.hasOwnProperty('start') ? moment.utc(item.start._d).unix() : null; 

       return { 
        id: item.id, 
        fromTime: fromTime, 
        toTime: toTime, 
       }; 
      }), 
     }; 
    }); 
} 

とこれまでのところ、私のテストでは、このテストは合格/働いている

describe('getData()', function() { 
it('should return json data', function() { 
    $ctrl.parameters = [{ 
     name: 'test', 
     items: [{ 
      id: 1, 
      fromTime: null, 
      toTime: null 
     }, { 
      id: 13, 
      fromTime: null, 
      toTime: null 

     }] 
    }]; 

    expect($ctrl.getData()).toEqual([{ 
     name: 'test', 
     items: [{ 
      id: 1, 
      fromTime: null, 
      toTime: null 
     }, { 
      id: 13, 
      fromTime: null, 
      toTime: null 
     }] 
    }]); 
}); 
}); 

、しかし、あなたが私を見ることができるように、この(ジャスミン)のように見えますMoment.jsを使用している場合は、3項のif/elseをテストしていません。基本的には、項目にstart/endというプロパティが含まれているかどうかを確認し、存在する場合は、その値をepoch/unixタイムスタンプに変換し、toTimeまたはfromTimeのいずれかに割り当てます。項目は'Sat Oct 31 2015 00:00:00 GMT+0000 (GMT)'の値で終わりというプロパティを持っていたのであれば、それは'1446249600'に変換し、それを説明するtoTime

願わくばに割り当てられます!私はそれのためのテストを書く方法がわからないし、助けや提案を感謝します。

答えて

6

最も簡単な選択肢は、入力のために手動で日付を手動で作成することです。例えば:(。なおはgetDataが入力を期待しているものであるので、上記の例では、Iは、それぞれ、startendfromTimetoTime変更)

そしてそれらのUNIXを

$ctrl.parameters = [{ 
    name: 'test', 
    items: [{ 
     id: 1, 
     start: moment.utc('2017-01-01T01:00:00'), 
     end: moment.utc('2017-01-01T06:00:00') 
    }, { 
     id: 13, 
     start: moment.utc('2017-01-02T08:00:00'), 
     end: null 

    }] 
}]; 

見つけ出しますタイムスタンプ。あなたは、外部からこの部分を行うことができます - 例えば、私はちょうど、moment.jsのウェブサイト上でブラウザの開発者向けツール(F12)を開いたコンソールで、次のステートメントを評価され、タイムスタンプの値をつかん:

moment.utc('2017-01-01T01:00:00').unix() 
moment.utc('2017-01-01T06:00:00').unix() 
moment.utc('2017-01-02T08:00:00').unix() 

を最後にあなたの代わりに独自の変数に各例の日付を格納することができ、あなたではなくあなたのユニットテストでハードコードされたタイムスタンプを持っていない場合は、代わりに

expect($ctrl.getData()).toEqual([{ 
    name: 'test', 
    items: [{ 
    id: 1, 
    fromTime: 1483232400, 
    toTime: 1483250400 
    }, { 
    id: 13, 
    fromTime: 1483344000, 
    toTime: null 
    }] 
}]); 

:、バックユニットテストでは、単にタイムスタンプが期待値と一致していることを確認(例えば、start1,end1)と比較し、次に、例えば、start1.unix()

// Arrange 
const start1 = moment.utc('2017-01-01T01:00:00'); 
const end1 = moment.utc('2017-01-01T06:00:00'); 
const start2 = moment.utc('2017-01-02T08:00:00'); 
$ctrl.parameters = [{ 
    name: 'test', 
    items: [{ 
     id: 1, 
     start: start1, 
     end: end1 
    }, { 
     id: 13, 
     start: start2, 
     end: null 

    }] 
}]; 

// Act 
const result = $ctrl.getData(); 

// Assert 
expect(result).toEqual([{ 
    name: 'test', 
    items: [{ 
    id: 1, 
    fromTime: start1.unix(), 
    toTime: end1.unix() 
    }, { 
    id: 13, 
    fromTime: start2.unix(), 
    toTime: null 
    }] 
}]); 

単体テストはmoment.jsではなくコードをテストするため、これは問題ありません。それはあなた次第です。

また、私はArrange-Act-Assertパターンを使用してテストを整理しています。繰り返しますが、ユニットテストが複雑になると、それに追従しやすくなります。

いずれかの方法で、あなたはstartendのいずれかのためにnullに渡すと書かれたコードは動作しませんので、あなたは、あなたのgetData方法でtoTimefromTimeの計算方法を変更する必要があります。特にitem.hasOwnProperty('start')nullの値をstartに渡すとtrueを返しますが、item.start._dを評価しようとするとエラーになります。 は代わりに、私は次のようにそれらの2行を変更することをお勧めします:

const toTime = item.end ? moment.utc(item.end._d).unix() : null; 
const fromTime = item.start ? moment.utc(item.start._d).unix() : null; 

ことが、内部(プライベート)変数であるので、私はまた、瞬間オブジェクトの_dプロパティを使用しないことをお勧めします。 startendが既にモーメントオブジェクトなので、あなただけではなく、これを行うことができるかもしれません:

const toTime = item.end ? item.end.unix() : null; 
const fromTime = item.start ? item.start.unix() : null; 

上記の変更を推奨するすべてを含む完全jsbin例はここにあります:

https://jsbin.com/xuruwuzive/edit?js,output

AnglesJSのコンテキストの外で実行するようにいくつかの調整が行われなければならないことに注意してください(getDataを$ctrlではなく直接パラメータを受け取るスタンドアロン関数にしてください)。

+0

ありがとうございました!その働き。そしてサンプルもありがとう! –

関連する問題