web-dev-qa-db-ja.com

単体テストのためにmoment.utc()をモックする方法は?

Nodeで始めて、現在いくつかの単体テストを書いています。最初のいくつかの関数では問題なく動作しますが、moment.utc() in it。私の関数の簡略版は次のようになります。

_function calculate_x(positions, risk_free_interest){
    let x = 0;
    for (let position of positions) {
        let expiry_in_years = get_expire_in_years(moment.utc());
        if (expiry_in_years > 0){
            let pos_x = tools.get_x(expiry_in_years, risk_free_interest);
            x += pos_x;
        }
    }

    return x;
}
_

私は基本的なノードのアサートテストライブラリを使用してこれをテストしようとします:

_"use strict";
const assert = require('assert');
let positions = [{this: 'is', a: 'very', large: 'object'}]; 
assert.strictEqual(calculate_x(positions, 1.8), 1.5);
_

これが実行される時刻(および結果)は常に異なるため、これは常に失敗します。

Pythonでモッククラスとオブジェクトを設定できます。この問題をNodeでモーメント.utc()を指定せずに解決できる方法はありますか? calculate_x()関数への引数?

14
kramer65

モーメントにより タイムソースの変更

Momentが認識する時間を変更する場合は、Unixエポック(1970年1月1日)以降のミリ秒数を返すメソッドを指定できます。

デフォルトは次のとおりです。

_moment.now = function () {
    return +new Date();
}
_

これは、moment()を呼び出すときに使用され、format()からトークンが省略されたときに現在の日付が使用されます。一般的に、現在の時刻を必要とするメソッドは、これを内部で使用します。

したがって、コードがmoment.utc()を実行したときにカスタム出力を取得するために_moment.now_を再定義できます。

28
VincenzoC
const moment = require('moment'); 
const time = moment().valueOf();
moment.now = jest.fn().mockReturnValue(time);
0