くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Cloud Functions for Firebase + jest + TypeScript

Cloud Functions for Firebase + TypeScriptでテストを書くときの初期設定の備忘録。

ディレクトリ構成

.
├── __tests__          ... テストのコード
├── src                ... ソースのコード
├── lib                ... コンパイルしたコードの出力先
├── jest.config.js
├── package-lock.json
├── package.json
├── tsconfig.json
└── tsconfig.build.json ... ビルド用のtsconfig.json

テストコードはデプロイしたくないので、src配下には配置しない形。
そのままだと、コンパイルの対象にならないので、ビルド用のtsconfig.jsonも利用する。

インストール

まずはインストール。

$ npm i -D jest ts-jest @types/jest
$ npm i -D sinon @types/sinon

ts-jestというTypeScript用のプリプロセッサがあるので、それも利用する。
sinonは、spyやstub、mockなどのライブラリ。

jestの設定

テストとして実行する対象(testMatch)や前処理を行う対象(transform)を指定。
package.jsonでも指定できるけど、TypeScript Deep Diveにあわせる。

// jest.config.js
module.exports = {
  testMatch: [
    "**/__tests__/**/*.+(ts|tsx|js)",
    "**/?(*.)+(spec|test).+(ts|tsx|js)"
  ],
  transform: {
    "^.+\\.(ts|tsx)$": "ts-jest"
  }
};

tsconfig.jsonの設定

型定義を追加したので、typesに追加。
__tests__includeに追加する。

{
  "compilerOptions": {
    // ... 略
    "types": [
      // ... 略
      "@types/jest",
      "@types/sinon",
    ]
  },
  // ... 略
  "include": [
    "src", 
    "__tests__"
  ]
}

tsconfig.build.jsonの設定

ビルドするときは__tests__配下を対象にしたくないなぁと思ってたら、 Stack Overflowのが良さそうだったので、試してみた。

ビルド用にtsconfig.build.jsonを用意する形。
tsconfig.jsonを拡張して、excludeを設定する。

// tsconfig.build.json
{
  "extends": "./tsconfig",
  "exclude": ["**/__tests__/", "**/*.test.ts", "**/*.mock.ts"]
}

packge.jsonの設定

npm tnpm run testでjestを実行できるようにscriptsを設定。
あと、ビルドするときは、tsconfig.build.jsonを使うように変更

// package.json
{
  "scripts": {
    // ... 略
    "build": "tsc --project tsconfig.build.json",
    "test": "jest"
  },
}

テストの実行

# 全実行
$ npm t

# ファイル指定
$ npm t __tests__/sum.test.js

# テストケース指定
$ npm t -- -t hoge_case

以上!!

参考にしたサイトさま