web-dev-qa-db-ja.com

モカテストでNode.jsグローバル変数を使用する方法

Node.jsで使用しているグローバルオブジェクトのモカテストで問題が発生しました。

インデックスファイルで、グローバル変数に値を設定しました

// index.js
global.enums = enumTemp

export default app

そして、それを別のファイルで使用しました

// other.js

status = global.enums.object.status

REST APIであり、サーバーにリクエストを送信した場合は問題なく動作します。ただし、Mochaテストを使用すると、Node.js global variableの値を取得できないようです。任意のアイデア全員?

10
Toan Tran

私はMochaフックを使用してglobal variableを設定するだけで機能する解決策をテストのために見つけました:

// setup.test.js
import MyFunc from '../helpers/my-func'

before((done) => {
  MyFunc.then((variable) => {
    global.variable = variable
    done()
  })
})

実際のコードと同じように、テストでglobal.variableを使用できます。

12
Toan Tran

グローバルは醜いので、おそらくあなたの問題も解決するので、グローバルを取り除くべきです。

Node.js require()の動作については、あまり知られていない事実があります:モジュールは最初のrequireでキャッシュされます。これにより、コストのかかる計算を実行(またはデータベースから何かをフェッチ)し、モジュールを後で使用するときにそれをキャッシュすることができます。

この例を見てください:

randomnumber.js

const calculateRandomNumber = limit => {
  console.log('calculateRandomNumber called');
  return parseInt(Math.random() * limit);
};

module.exports = calculateRandomNumber(1000);

other.js

module.exports = require('./randomnumber');

test.js

const randomnumber = require('./randomnumber');
const other = require('./other');
console.log(randomnumber);
console.log(other);

これは、same乱数を2回出力し、calculateRandomNumberモジュールが呼び出されても、randomnumberは1回だけ呼び出されます別の場所で必要です。

1
Tobi Kremer