Jestでe2eテストを実行する前に、サーバーから認証トークンを取得する必要があります。
これをグローバルに実行して、各テストのグローバル環境/コンテキストに何らかの方法で設定することは可能ですか?
globalSetup
configオプションで試してみました。
_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"
},
_
より良いアプローチ(シェルを含まない)はありますか?
次の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
/teardown
apiを公開するカスタムクラスを実装する必要があります。
例:
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;
});
_