ユニットテストのためにAngularにJestを導入する
ユニットテストのためにAngularにJestを導入する
なぜKarmaからJestに移行したのか
Karmaでプロジェクトで穴にあいました
最近新しく1つのプロジェクトを交換して、行った時にプロジェクトはすでに2ヶ月をして、前期の急いで機能するため、ユニットのテストに対して要求をしていないで、CI/CDの時も強制的にユニットのテストを走っていません.したがって,Angular CLIが自動的に生成したテストファイルがあるが,基本的にはテストが不合格である.プロジェクトが長くなって、人員の変動が多くて、新しく来たメンバーは前の業務の論理に対してはっきりしないで、少し注意しないと前の機能を破壊します;業務が複雑になると、少しでも機能を増やしたり修正したりして、気づきにくいバグを引き起こす可能性があります.敬業の開発として、ユニットテストに行かないとどうすればいいですか.したがって、既存のユニットテストを修復するタスクがあります.既存のテストファイルを修復する考え方は簡単です.TestingModuleを書いて、よく使われる依存mockを落として、必要なファイルに導入すればいいです.あまり使わない依頼は、それぞれのファイルでmockを落とすといいでしょう.しかし実際に操作すると、Karmaは早く穴を掘って待っていた.一部のテストファイルは単走で問題がなく、全体が走ったときに間違いを報告し、テスト結果と不安定である.karmaのエラーメッセージは特に読みにくく、どこが問題なのか分からないことが多い.さらにKarmaはAngularアプリケーションをコンパイルしてからブラウザでテストする必要があり、全体の時間も遅く、修復の過程は狂った縁にある.全体テストで走っているときにテストミスの位置を特定するのは難しいですが、どうすればいいのでしょうか.AngularではJest大法も非常に使いやすいことが実証されている.
KarmaとJestの対比
前述したように、修復テストの過程でkarmaは様々な問題に直面した.まとめると大体:
対照的に、Jestはこれらの面で良い表現をしています.
Jestには次のようなメリットがあります.
いどう
最初のステップは、依存パッケージが必要です.
npm install --save-dev jest jest-preset-angular @types/jest
次のようになります.
"jest": {
"preset": "jest-preset-angular",
"setupFilesAfterEnv": ["/src/setupJest.ts"]
}
ここで、
preset
はプリセットを宣言し、setupFilesAfterEnv
はJest setupファイルのアドレスを構成し、複数のファイルを含むことができ、ここではプロジェクトルートディレクトリの下のsrc/setupJest.ts
を設定する.ステップ3では、srcディレクトリの下に、前のステップで設定したsetupファイル
setupJest.ts
を作成します.import 'jest-preset-angular'; // jest angular
import './jestGlobalMocks'; // jest mock
第4のステップでは、srcディレクトリの下に
jestGlobalMocks.ts
ファイルを作成し、関連するグローバルmockを追加します.以下は例です.const mock = () => {
let storage = {};
return {
getItem: key => key in storage ? storage[key] : null,
setItem: (key, value) => storage[key] = value || '',
removeItem: key => delete storage[key],
clear: () => storage = {},
};
};
Object.defineProperty(window, 'localStorage', {value: mock()});
Object.defineProperty(window, 'sessionStorage', {value: mock()});
Object.defineProperty(window, 'getComputedStyle', {
value: () => ['-webkit-appearance']
});
この例では、jsdomがすべてのwindow上のオブジェクトと方法を実装していないため、自分でwindowにパッチを付ける必要がある場合があります.ここでmock
localStorage
はオプションであり、コードで使用されていない場合はオプションです.ただしmock getComputedStyle
は、Angularがどのブラウザで実行されるかをチェックするため必須です.mock getComputedStyle
がなければ、私たちのテストコードは実行できません.次はpackageでjsonのscriptでtestを構成するコマンド:
"test": "jest",
"test:watch": "jest --watch",
このうち
test
は1回のテストのみを実行し、test:watch
はファイルの変化を検出し、現在修正されているファイルに関するテストを実行することができます.この場合、コマンドラインでテストコマンドを実行すれば、スムーズにテストを走り出して合格できるはずです.もし合格しなかったら、私たちが
src/tsconfig.spec.json
のfile構成にtest.js
の構成があるからかもしれません.これはKarmaのsetupファイルです.この行の構成を削除して対応するファイルを削除します.(src/tsconfig.app.json
に現れたtest.js
も一緒に削除できます)、テストコマンドをもう一度実行します.npm run test
これで、Jestテスト環境は順調に構築されました.コードに潔癖がある場合は、Karmaの関連コードを削除して、テストをすべてJestに変更することもできます.
Karma関連コードの削除
npm uninstall karma karma-chrome-launcher karma-coverage-istanbul-reporter karma-jasmine karma-jasmine-html-reporter
src/karma.config.js
src/tsconfig.spec.json
のうちcompilerOptions.type
の構成はjasmineを除去しjestを加える.これで、Karmaに関連するすべてのコードを削除しました.テストの断言をjestのスタイルに変えることもできます.最後に生成されたコード・ライブラリと関連ファイル構成の表示
参照先: