サイトアイコン

toLog

SAMでJestを使っていると遭遇するNetworkErrorを解決

  • 更新日:
  • 投稿日:
サムネイル

この記事は最終更新日から4年以上が経過しています。

先日、お問い合わせフォームを実装していて、デプロイ先が AWS になるので、お金を掛けたくないこともあって 443 ポート経由でメールを送信できる SendGrid で簡単な API を作っていました。

フォームを受け取って、バリデーションを行った後に、SendGrid の API に内容を渡すことでメールを送信する簡単な API です。

SAM でローカル開発、テストに Jest を使っていたのですが、SendGrid の API を叩くテストをしてみると、、、

1// sendgridで送信
2await sendgrid
3  .send({
4    to: to,
5    from: email,
6    subject: subject,
7    text: body,
8  })
9  .catch((error) => {
10    throw error;
11  });
1Error: Network Error
2  at createError (../node_modules/axios/lib/core/createError.js:16:15)
3  at XMLHttpRequest.handleError (../node_modules/axios/lib/adapters/xhr.js:83:14)
4  at XMLHttpRequest.<anonymous> (../node_modules/jsdom/lib/jsdom/living/helpers/create-event-accessor.js:32:32)
5  at innerInvokeEventListeners (../node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:318:25)
6  at invokeEventListeners (../node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:274:3)
7  at XMLHttpRequestImpl._dispatch (../node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:221:9)
8  at fireAnEvent (../node_modules/jsdom/lib/jsdom/living/helpers/events.js:18:36)
9  at requestErrorSteps (../node_modules/jsdom/lib/jsdom/living/xhr/xhr-utils.js:128:3)
10  at Object.dispatchError (../node_modules/jsdom/lib/jsdom/living/xhr/xhr-utils.js:59:3)
11  at EventEmitter.<anonymous> (../node_modules/jsdom/lib/jsdom/living/xhr/XMLHttpRequest-impl.js:654:18)
12  at EventEmitter.emit (events.js:333:22)
13  at Request.<anonymous> (../node_modules/jsdom/lib/jsdom/living/xhr/xhr-utils.js:390:47)
14  at Request.emit (events.js:321:20)
15  at Request.onRequestError (../node_modules/request/request.js:877:8)
16  at ClientRequest.emit (events.js:321:20)
17  at TLSSocket.socketOnData (_http_client.js:483:9)
18  at TLSSocket.emit (events.js:321:20)
19  at addChunk (_stream_readable.js:294:12)
20  at readableAddChunk (_stream_readable.js:275:11)
21  at TLSSocket.Readable.push (_stream_readable.js:209:10)
22  at TLSWrap.onStreamRead (internal/stream_base_commons.js:186:23) {

何ですのコレ?😕

分かることは axiosjsdom 周りでエラーが頻発していることです。

なんで jsdom が Jest で動いているの?

Jest はフロントとバックでテスト環境が異なる

調べてみると、どうやら Jest はテスト環境が 2 つあるようです。

  • jsdom:ブラウザ環境(フロントエンド)
  • node:言わずもがな node 環境(バックエンド)

そして、今回のような node 環境下でのテストでは、環境設定を node に変更する必要があったようです。

結論

下記のように、package.jsontestEnvironment パラメータを node に指定してあげます。

1"jest": {
2    "testEnvironment": "node"
3}

おわりに

最初は SendGrid 周りが悪さをしているのかと、ドキュメントをあさっていたのですが、エラーを見てみると jsdom が悪さしていることに気づいて結論に至りました。

ですが、やっぱり、エラーを読めていない証拠だなと反省する一幕でした。

おそらく、これは sendgrid の内部で axios を使っているために起こるエラーだと思われるのですが、結果的に jsdom に着目して解法に至ったので結果オーライです。

参考文献


プロフィール画像

canji

とにかく私的にサービスを作りたい発作を起こしている。お腹はペコペコ。

  • toLog Tools icon
  • dots icon