先日、お問い合わせフォームを実装していて、デプロイ先が 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) {
何ですのコレ?😕
分かることは axios、jsdom 周りでエラーが頻発していることです。
なんで jsdom が Jest で動いているの?
Jest はフロントとバックでテスト環境が異なる
調べてみると、どうやら Jest はテスト環境が 2 つあるようです。
- jsdom:ブラウザ環境(フロントエンド)
- node:言わずもがな node 環境(バックエンド)
そして、今回のような node 環境下でのテストでは、環境設定を node に変更する必要があったようです。
結論
下記のように、package.json
で testEnvironment
パラメータを node に指定してあげます。
1"jest": {
2 "testEnvironment": "node"
3}
おわりに
最初は SendGrid 周りが悪さをしているのかと、ドキュメントをあさっていたのですが、エラーを見てみると jsdom が悪さしていることに気づいて結論に至りました。
ですが、やっぱり、エラーを読めていない証拠だなと反省する一幕でした。
おそらく、これは sendgrid の内部で axios を使っているために起こるエラーだと思われるのですが、結果的に jsdom に着目して解法に至ったので結果オーライです。