この記事の内容
業務で、Rails
のSPAを作っています。フロントのテストフレームワークとしてJest
を導入することになり、チームで探りつつ実装したので、その記録をまとめたいと思います。
なお、各種バージョンは以下の通りです。
- Rails ... 6.1.0
- Jest ... 27.4.7
- node.js ... 14.19.0
必要なライブラリの導入
必要なライブラリを導入します。TypeScriptを使用していたので、Jestだけではなく @type/jest も必要でした。
$ yarn add --dev jest @types/jest
そして package.json の script に以下を追加します。
{
"scripts": {
"test": "jest"
...
},
...
}
設定、ディレクトリ構成
この時点で yarn test
を実行しようとすると、 config/webpack/test.js
を実行しようとしてテストが失敗します。これはこちらの記事によると以下の理由からだそうです。
これは、Jestがプロジェクト内のテストファイルを探索する方法が原因です。基本的にはプロジェクト全体のうち.spec.jsか.test.jsにマッチするすべてのファイルを実行します。ここではテストファイルが*.test.jsとマッチしたので、テストとして実行されようとしていたのです。
そのため、package.json に以下の記述を記載し、Jestがファイルを検索するために使用するディレクトリのパスを指定します。
{
...
"jest": {
"roots": [
"<rootDir>/app/javascript"
]
}
}
<RootDir>
は公式の記載によると「Jest
の設定ファイルかpackage.json
を含むディレクトリ、もしくは設定がひとつもない時はpwd
のディレクトリ」を表す記述」だそうです。
最初のテスト
ここでJestが動作するはずなので、最初のテストを書きます。
先ほどroots
で指定した/app/javascript
下に、__tests__
というディレクトリを作って、サンプルのファイルを書きます。
describe('サンプルテスト', () => {
test('trueになる', () => {
expect(true).toBeTruthy()
})
})
フロントエンドをざっくり学んだ時に使用したこちらのテキストによると、Jestでは、describe()
という関数でテストケースをまとめ、そのブロック内にtest()
関数を書いてテストをしていくようです。
describe()
やtest()
の第一引数に「何をテストするか」を書くことで可読性が上がります。
以上で、テストが動くことが確認できると思います!
おまけ:CircleCIでも実行
テスト自体の設定はこれで終わりなのですが、今回はCIツールへの接続も行いました。
CIのrun
で実行するコマンドの中で、先ほどpackage.json
で設定したyarn test
を実行すれば良いだけなのですが、node.js
のバージョンが合わなかったりしてエラーになったので、コマンド中でyarn install
も実行しました。
- run:
name: Jestの実行
command: |
yarn install
yarn test
※本当はyarn install
とyarn test
の記載は離れていたり、キャッシュを用いて処理を高速化するような記載もあるのですが、詳細割愛します。
その他
これからReactで実装している諸々のテストの記載をしていくので、何か気づきがあれば投稿したいです
参考資料など