web-dev-qa-db-ja.com

Jestを使用した環境の非同期セットアップ

Jestでe2eテストを実行する前に、サーバーから認証トークンを取得する必要があります。

これをグローバルに実行して、各テストのグローバル環境/コンテキストに何らかの方法で設定することは可能ですか?

globalSetupconfigオプションで試してみました。

_const auth = require('./src/auth')
const ctx = require('./src/context')

module.exports = () => {
    return new Promise(res => {
        auth.getToken()
            .then(token => {
                ctx.init({token})
                global.token = token
                res()
            })

    })
}
_

context.js

_let _token

const init = ({token}) => {
    _token = token
}

const getToken = () => {
    return _token
}

module.exports = {
    init,
    getToken

}
_

ただし、_global.token_もctx.getToken()も未定義を返します。

ヘルパースクリプトを使用し、トークンをenv varとして渡す必要があります。これは、globalとして設定されます。

_  "scripts": {
    "test": "TOKEN=$(node src/get-token.js) jest"
  },
_

より良いアプローチ(シェルを含まない)はありますか?

5
ps-aux

次のCLI/configオプションがあります: setupFiles 、テストコード自体を実行する直前に実行されます。

_"jest": {
  "globals": {
    "__DEV__": true,
    ...
  },
  "setupFiles": [
    "./setup.js"
  ]
}
_

_setup.js_は次のようになります。

_(async function() {
    // const { authToken } = await fetchAuthTokens()
    global.authToken = '123'
})()
_

そして、beforeAll(_ => console.log(authToken)) // 123のように、各テストスイート(ファイル)でauthTokenに直接アクセスできます。


ただし、テストファイルごとではなくワーカー(CPUコア)ごとに実行されるグローバルセットアップが必要な場合(テストスイートはサンドボックス化されているため、デフォルトで推奨されます)。現在のjestAPIの制約に基づいて、 testEnvironment オプションを使用してテストのランタイム環境をカスタマイズすることを選択できます。次に、jsdom/node環境がsetup/runScript/teardownapiを公開するカスタムクラスを実装する必要があります。

例:

customEnvironment.js

_// my-custom-environment
const NodeEnvironment = require('jest-environment-node');

class CustomEnvironment extends NodeEnvironment {
  constructor(config) {
    super(config);
  }

  async setup() {
    await super.setup();
    const token = await someSetupTasks();
    this.global.authToken = token;
  }

  async teardown() {
    await super.teardown();
    await someTeardownTasks();
  }

  runScript(script) {
    return super.runScript(script);
  }
}
_

my-test.js

_let authToken;

beforeAll(() => {
  authToken = global.authToken;
});
_
9
Xlee