今回もJestの記事だが、React x Typescript x Jest の組み合わせを書いてなかったな。ということで。
今回も参考にするのはこの記事。その中の Example enzyme
という章を参照する。
enzyme
ってのはよくわからんですが、React でテストするときに便利になる感じのライブラリらしい。
必要なパッケージをインストール
$ npm i enzyme @types/enzyme enzyme-to-json enzyme-adapter-react-16 -D
ただ、これだけだと、テスト実行時に enzyme-adapter-reacta-16 の 定義がないと怒られてしまうので、以下のパッケージもインストールする
$ npm i @types/enzyme-adapter-react-16 -D
jest.config.js
に設定を追記
module.exports = { // OTHER PORTIONS AS MENTIONED BEFORE // Setup Enzyme "snapshotSerializers": ["enzyme-to-json/serializer"], // 参考元記事では "setupTestFrameworkScriptFIle" を使用していたが // 廃止予定 ということで新しいほうの記述で書く "setupFilesAfterEnv": ["./src/setupEnzyme.ts"], }
src/setupEnzyme.ts
ファイルの作成
import { configure } from 'enzyme'; import * as EnzymeAdapter from 'enzyme-adapter-react-16'; configure({ adapter: new EnzymeAdapter() });
src/components/checkboxWithLabel.tsx
, src/components/checkboxWithLabel.test.tsx
の作成
ここは参考元と一緒なので割愛
テスト実行
$ npx jest
すると以下のようなエラーがでる。(はず)
FAIL src/components/checkboxWithLabel.test.tsx ● Test suite failed to run TypeScript diagnostics (customize using `[jest-config].globals.ts-jest.diagnostics` option): src/components/checkboxWithLabel.tsx:9:15 - error TS7006: Parameter 'props' implicitly has an 'any' type. 9 constructor(props) { ~~~~~
props
の型指定がないよ。ということなのかな?と思ったので。つける。
import * as React from 'react'; export class CheckboxWithLabel extends React.Component<{ labelOn: string, labelOff: string }, { isChecked: boolean }> { constructor(props: any) { // ここを変えた super(props); this.state = { isChecked: false }; } ...
も一度テストを実行すると通った。
おわり。
成果物は以下。