npmでrequestをインストール
Node.jsでリクエストを送るにはnpmパッケージのrequestが便利なので、ここではそれを使ってAPIを叩きます。(標準ライブラリでやる方法もあるらしいのですが、筆者はやったことありません。すみません。)
テストプログラム用のプロジェクト内で以下コマンドを実行すると、プロジェクト内にrequestの最新バージョンがインストールされます。
この記事を書いた時点ではバージョン2.88.0でした。
requestでWebAPIを叩く
試しに叩けるAPIは無いかと探したところ、ぐるなびAPIというのがありました。このページの『レストラン検索API』を使わせてもらいます。GET
で叩けて、JSON形式で返ってくるAPIみたいですね。
WebAPIにはアクセスキーとかトークンがあるのが常ですが、ぐるなびAPIでは keyid
というのを使うようです。上記ページでは、日ごとに切り替わる仮の keyid
が表示されてます。
このレストラン検索APIは、keyid
を指定せずにアクセスすると怒られます。当然です。この時、ステータスコードは 401
が返され、レスポンスボディは以下の通りとなります。
今回はこのAPIを例に、レスポンスを検証するテストプログラムを書いてみます。
※公開APIなので、レスポンス内容が変わったり、API自体が無くなったりする可能性があります。もしぐるなびAPIが無くなることがあったら、上記のレスポンス内容を念頭に、想像で読んでください。
レスポンスをアサーション
とりあえず、request
を使って簡単に作ってみたものが以下のサンプルとなります。
ポイントは以下2点です。
this.timeout()
でタイムアウトを10,000ミリ秒に延ばす。mocha
はデフォルトでは it()
ごとに2,000ミリ秒でタイムアウトするので、遅くなりそうなテストでは延ばしておく。
done()
で終了する。request
のような非同期処理をテスト内で使う場合、ケース完了時に it()
の第一引数から受け取ったコールバック関数 (慣例として done
とする) を実行することで終了できる。
JSONパース失敗時に fail()
でエラー終了させるのは、筆者はよくやりますが、もっと適切な方法があるかもしれません。it()
内でエラーが出そうな処理を行う時は、これをすると何行目でエラーが出たのか分かりやすくなります。
これを mocha
で実行すると、エラー無く終了するはずです。
もっと細かくアサーション
上記の例は、レスポンスボディのアサーションがすごく大雑把です。expect().deep.equal()
で一発でやってしまってます。
今回のように小さなレスポンスならこれでも大丈夫ですが、もっと大きくなると、どこでエラーが出たか分かりにくくなりそうです。なので、もう少し細かくアサーションしてみます。
レスポンスボディのアサーション部分を、以下の通りに変更します。
これも同様にエラー無く終了するはずです。
同期的にテストする方法
ちなみに上記のテストプログラムですが、非同期にせずに同期的に書く方法もあります。
request
をPromise化して await
で実行します。分かりやすいので、個人的にはこちらの方をよく使います。
おまけ:requestでJSONをPOST
こういうAPIが多いと思うので書いておきます。テスト関係ありません。
以上
以上でWebAPI編は終わりです。ぐるなびさんごめんなさい。次はAWS SQS編です。