sironekotoroの日記

Perl で楽をしたい

Jest で __tests__ フォルダにテスト用ファイルを置いたのに読み込んでくれない(解決)

タイトルの通り

Jest ってのは JavaScript / TypeScript のテストフレームワークです。

jestjs.io

テスト実施時に hoge.test.ts のように拡張子の手前に test っていう文字列を入れたファイルを用意するか、プロジェクトフォルダの直下に作った __tests__ フォルダの下にテスト用のスクリプトファイルを入れておくと、テストをやってくれます。

くれるはずなんですが・・・うちの環境では __tests__ に入れたファイル読んでくれませんでした。

Jest の設定ファイルである jest.config.js 見てみると、パターンマッチ的にも問題なさそうです。 うーむ。

// The glob patterns Jest uses to detect test files↲
 testMatch: ["**/__tests__/*.+(ts|tsx|js)",↲
   "**/?(*.)+(spec|test).+(ts|tsx|js)",↲
 ]

"**/__tests__/*.+(ts|tsx|js)",↲ ここ。

で、試しにパターンマッチを全部削って ./__tests__/hoge.test.ts と直接ファイル名を記述したりしたけどダメ。

なぜだ。

まぁ、テスト自体は src/ に入れた hoge.test.ts を読み込んでくれるので、テストを実施する回避策はあるんですが、納得できない。

納得は全てに優先します、自分のプロジェクトであればなおさら・・・

解決

今回、TypeScript を書くにあたってソースファイルを src/ フォルダの中に入れていたのですが、そのとき Jest の設定を書き換えていました。

以下の設定をコメントアウトして有効にしていました。

   // A list of paths to directories that Jest should use to search for files in↲
  roots: ["<rootDir>/src",↲
  ],↲

はい、ちゃんと書いてますね。

A list of paths to directories that Jest should use to search for files in↲

Jestがファイルを検索する際に使用するディレクトリのパスのリスト↲

この設定が有効になっていると、Jest はファイルを探すときに src の中しか見ないわけです。

ということで、ここをコメントアウト

無事、テストを __tests__ フォルダに隔離してもテストを実行してくれるようになりました。

めでたしめでたし。

なんで TypeScript 書いてるん?

Google Apps Script (GAS)で動かすためです。

これまで GAS が提供している Web エディタで書いてきたのですが、そろそろ適切な分割とかモジュールの利用をしないと厳しくなってきました。

GAS、特に Sheet と密接に関わるコードは(モックとか作るの面倒なので)継続してウェブ上のエディタで JavaScript 書いていきます。

しかし、Sheet と関係のないところは、切り出して小さいモジュールを作って良いのではないか?

小さいモジュールなら、実験がてら TypeScript で書いてみてもいいのでは?

と思った次第です。

いまは 2021 年 10 月 1 日に変更された PayPay銀行と三菱UFJ銀行の振込手数料判定プログラムなどを書いています。

www.paypay-bank.co.jp

www.bk.mufg.jp

手元で TypeScript を書いて、clasp というツールで GAS に反映させています。

TypeScript はなんというか、コンパイルして JavaScript を吐き出すことが迂遠と思っていたのですが、以下の資料を見て認識を改めた次第です

future-architect.github.io

新しい記法を使うが、ブラウザの互換性を維持するコードを書く手法としてコンパイラを使うのが当たり前になってきた

TypeScript については環境構築や、どのツールを使えばいいのかもわからないというのが正直なところですが、とりあえず Web+DB の TypeScript 特集とかみながら試行錯誤中です。

gihyo.jp

なぜこんな小ネタを?

  • 普段から Perl 入学式で「わからなかったところをブログとかに残しておくと、数年後の自分が面白い」と言ってることもあり、数年後の自分を楽しませるため

  • ググっても同じようなネタで苦しんでる人がいなかったため(StackOverFlow にいたけど、ちゃんとした回答ついてなかった)