グローバルbeforeAllの方法はありますか?
各テストファイルでbeforeAllを定義できますが、これにより、テストファイルごとにbeforeAllが1回実行されます。
最初のテスト開始前に一度実行されて終了するグローバルbeforeAllはありますか?
setupFilesを見たことがありますか?
参考までに、私のプロジェクトでは次のようにsetupFiles
を使用しています。
package.json
{
"jest": {
"setupFiles": [
"./private/mocks/runtime.js"
]
}
}
./private/mocks/runtime.js
global.__meteor_runtime_config__ = {ROOT_URL: 'localhost'};
FYI Stack Overflowは、この種の質問に適した場所かもしれません。 (バグレポート/機能リクエストの代わりに使用法についての質問)。
また、私はこの問題の購読を解除したので、返信しても通知は届きません。
create-react-appを使用しています。
およびsetupFilesは、テストファイルごとに再度実行されます。
正しくない答えを出し、その後問題を解決します。 ブラボー!
@cpojer @ashtonsixこれを閉じる必要はないと思いますが、答えは正しくありません。テストスイートごとにsetupFiles
またはsetupTestFrameworkScriptFile
の両方が実行されるため、「グローバル」のbeforeAllはありません。設定できる場所は、テストする前にテストデータベースをクリーンアップするようなものです。
package.jsonにpretest
を含めることができますか?
@ Negan1911-たぶん、しかし、OPで何を意味するのかを判断するのは難しいです。 便利な機能であり、この機能のリクエストをより明確にしたい場合は、2番目の問題を作成することを検討できますか?
@cpojer @ashtonsix私が正しく理解していれば、現在、モカで説明されているようなグローバルなセットアップと分解を行うことはできません。
私(およびおそらくOP)のユースケースは、サーバーを実行してから、すべての統合テストを実行したいというものです(そして、おそらくすべての統合テストを実行した後、テストDBを削除します)。
これを行うためのアドバイスやベストプラクティスはありますか?
私が見つけたのは、ほとんどの場合、サーバーを起動し、「ローカル」のbeforeAll / afterAllで、たとえば@kentcdoddsによってサーバーを閉じるように指示していることですが、多くの重複を意味します。
グローバル設定で+1、私のユースケースではプロキシサーバーも実行したい
@ashtonsixの価値については、私の意見ではOPは明確でした。 この号を再開してほしい。
カスタムjest-environment
を作成できます。 jest-environment-node
またはjest-environment-jsdom
を参照して、サブクラス化します。 それはあなたが好きな方法で環境をセットアップすることを可能にするはずです。 これにも非同期フックを追加することについて話し合いましたが、PRを喜んで受け入れます。
+1モカからの冗談を試してみたかったのですが、同じ問題に悩まされるまで、 jest-codemods
とドキュメントの使いやすさに感銘を受けました。
それぞれの個別のファイルの最初のdescribe
はすべて、実行に驚くほど長い時間がかかりました。 以前のコメントで説明したように、セットアップはファイルごとに1回実行されたため、 DROP DATABASE
、 CREATE DATABASE
などの不必要な時間のかかる操作が大量に発生しました。
残念ながら、理想的ではないnode setup.js && jest
を実行することを除いて、ドキュメントには回避策がありません(これにより私はここに来ました)。
グローバル設定の場合は+1。 他のユーザーと同じように、アプリ/DBを一度だけセットアップして破棄したいと思います。
+1
#4506で修正
次のjestオプションglobalSetup
とglobalTeardown
があります。 https://facebook.github.io/jest/docs/en/configuration.html#globalsetup -string
globalSetup
を使用してみましたが、次のエラーが発生し続けます。このオプションで@shai32のトリックが実行される可能性があります。 しかし、私はそれを機能させることができないようです🤣...
"jest": "^21.2.1"
"jest": {
"globalSetup": "./jest-config.js"
}
md5-d3a1dcf99642fcf0b9c99c838aadb689
● Validation Warning:
Unknown option "globalSetup" with value "./jest-setup.js" was found.
This is probably a typing mistake. Fixing it will remove this message.
Configuration Documentation:
https://facebook.github.io/jest/docs/configuration.html
まだリリースされていません。 ジェスト22がいつでも入ってくる🙂
#4506で修正
私はそれがそこにリンクされていることを知っていますが、探している人のために: https ://github.com/facebook/jest/pull/4716
バグは#5095#5096で修正する必要があります
これを使用してグローバル変数を設定できますか? 試しましたが、うまくいきません。これは仕様によるものですか?
私のユースケースは、グローバルに設定したいカスタムログ関数があることです。 _setup.test.js
を試しましたが、グローバル変数が転送されません。
@zwhitchcoxはsetupFiles構成オプションを使用します: https ://facebook.github.io/jest/docs/en/configuration.html#setupfiles -array
非同期関数を介して設定されたグローバル変数を共有すると便利な場合があります。 たとえば、globalSetupでpuppeteerブラウザーを一度セットアップしてから、各テスト/テストスイートで新しいページを生成すると便利です。
@tdenovanまさに今私がやろうとしていることです。 しかし、それは機能していないようです。 私は以前モカでこれをやったことがあり、それは簡単でしたが、冗談で私は他の方法を見つける必要があると思います。
これは私の冗談の設定です
"jest": {
"verbose": true,
"testEnvironment": "node",
"globalSetup": "<rootDir>/scripts/testSetup.js",
"globalTeardown": "<rootDir>/scripts/testTeardown.js"
},
// globalSetup.js
module.exports = async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
bot = Bot(browser, page);
await bot.goto(bot.baseUrl);
global.bot = bot;
}
しかし、テストケースではボットにアクセスできません。
GGWP! ちょうどそれを解決しました。
"e2e": "jest --testRegex '.*.e2e.js'"
// globalTeardown.js
module.exports = async () => {
if (process.testSetup) {
process.testSetup.bot.close();
}
}
process.testSetup = { bot };
// and then im my tests
const { bot } = process.testSetup;
そして、誰もがボットが何であるか疑問に思っています、
const Bot = (browser, page) => ({
browser: browser,
page: page,
baseUrl: 'http://localhost:4000',
user: {
name: faker.name.findName(),
email: faker.internet.email(),
password: 'Test<strong i="13">@123</strong>',
},
oldUser: {
email: '[email protected]',
password: 'Test<strong i="14">@123</strong>',
},
clearSession: async () => {
await page.evaluate(() => sessionStorage.clear());
},
goto: async (url) => {
await page.goto(url);
},
clickButton: async (id) => {
await page.waitForSelector(id);
await page.click(id);
},
checkText: async (expect, id, text) => {
await page.waitForSelector(id);
const elText = await page.$eval(id, el => el.innerHTML);
expect(elText).toContain(text);
},
type: async (id, text) => {
await page.waitForSelector(id);
await page.$eval(id, el => el.value = '');
await page.type(id, text);
},
wait: async () => {
await page.waitForNavigation();
},
close: () => {
browser.close();
},
});
ウェブサイトにパペッティアのガイドがあります: https ://facebook.github.io/jest/docs/en/puppeteer.html
はい、しかしそれは、globalSetup非同期メソッドでグローバルを設定することが可能であることを示唆しています。これは上記のようにbではないようです。
@SimenB ahh .. man ...私はこれを理解しようとしていて、かなり長い間jest docsにいましたが、そのセクションに気付くことはありませんでした。 私の時間の無駄。
複数のテストスイートが並行して実行されている場合、globalSetupで設定したグローバルオブジェクトが使用できないという問題があります(これはデフォルトです)。 単一のスイートテストを実行すると、オブジェクトが使用可能になります。または、テストをシリアルに実行するように--runInBandを設定した場合。 テストを並行して実行する場合、globalSetupで設定した変数にアクセスするにはどうすればよいですか?
上記で使用した例(プロセスオブジェクトを使用)を試しました。また、カスタムTestEnvironmentを使用しているバージョンも試しましたが、運がありませんでした。
const PuppeteerJsdomEnvironment = require('jest-puppe-shots/lib/jsdom-environment');
class JestPuppeShotsEnv extends PuppeteerJsdomEnvironment {
async setup(config) {
await super.setup(config);
const { allThemesCss } = global;
// make the allThemesCss object available in test suites
Object.assign(this.global, {
allThemesCss
});
}
}
module.exports = JestPuppeShotsEnv;
これは、globalSetup.jsからallThemesCssを取得し、テストスイートに渡されていることを確認しています。
@ ovidiu-lapadusグローバルの代わりにprocess
を使用して、globalSetupを機能させることができました。 --runInBand
の有無にかかわらず動作します。 例えば
// globalSetup.js
module.exports = async () => {
process.FOOT = 'BALL';
};
// globalTeardown.js
module.exports = async () => {
console.log(process.FOOT) // BALL
};
// some.test.js
it('expects 1 to be 1', () => {
expect(1).toBe(1);
console.log(process.FOOT); // BALL
});
そして、jestチームにとって、 global
がテスト(babel-jest 22.2.2)で定義されていないのに、 globalTeardown.js
で定義されている理由はわかりません。 おそらくそれはバグです。 今のところ、 process
を使用します。 乾杯!
ありがとう@cellisあなたは私の日を救った! global.FOO
が機能しなかった理由を理解しようとして、壁に頭をぶつけてきました。 process.FOO
はトリックを行います:-)
@kalutheoprocess.FOOの使用にはいくつかの注意点があります。 まず、processまたはprocess.envで深くネストされた変数を実行できるとは思いません。 グローバルを機能させるためのさらに良い方法を見つけましたが、それを投稿するのを待っていました。 私がやったことは、jest-environmentパッケージを使用して、独自のdbEnvironment
を作成することです。 そこで、グローバルデータベースが定義されているかどうかを確認し、定義されていない場合は再定義します。 データベース環境はdbテストに対してのみ実行されます。フロントエンドのみのテスト用に別の構成があります。 そうすれば、フロントエンドを変更するたびにdbテストを実行する時間を無駄にすることはありません。 次に、常にホットな複数の「レプリカ」データベースを設定する方法があります。devdbと一緒に移行するため、jestを実行するたびにそれらを移行またはダンプする必要はありません(これは私が共有した要点です)、これによりテストをさらに高速に実行できます。 これらのレプリカのプールを設定して、テストで最大の並列処理を取得できるようにします。 それは一種のjestドキュメントに文書化されていますが、十分に説明されていません。 とにかく、ここに要点があります: https ://gist.github.com/cellis/08cc332dacf9a548005e8cf35d4b16e2
@ ovidiu-lapadus詳しく調べてみると、おそらくあなたの問題は、グローバルを割り当てる前にsuper.setup()
に電話したことだと思います。 実用的な解決策については、上記の要点を参照してください。
@cellisはこれらの貴重な情報に感謝します。 あなたが説明したようなカスタム環境で試してみます
皆さん、 globalSetup
には、 babel-polyfill
のようなすべてのヒーブタスクが含まれ、 chai
と組み合わされ、 jest-extended
が必要ではありませんか?
globalSetup
の動作はsetupTestFrameworkScriptFile
とは大きく異なり、そこで機能したものはglobalSetup
では機能しないようです。
私は知っている、すべてのjestテストケースは彼のsnadboxed環境で実行されますが、 setupTestFrameworkScriptFile
で何もしないと、テストの実行が遅くなります。
モカ:9秒
ジェスト:60年代、ウォッチモード:170〜200秒
?
process
を使用することは、おそらく壊れることになるハックです(これはバグです)。
あなたはおそらく#7184をフォローしたいと思うでしょう
最も参考になるコメント
グローバル設定の場合は+1。 他のユーザーと同じように、アプリ/DBを一度だけセットアップして破棄したいと思います。