問題
aws-mock
が aws-xray-sdk
に対応していないらしく、captureAWS
で XRay 関連の関数を呼び出そうとした時点で以下のようなエラーが出てしまいます。
/project/dir/node_modules/aws-xray-sdk-core/lib/patchers/aws_p.js:37
Service.prototype.customizeRequests(captureAWSRequest);
^
TypeError: Service.prototype.customizeRequests is not a function
どちらも、元の関数を別の処理に置き換える/処理を差し込むということを目的としているものなので競合は当然かもしれません。
とりあえずの対処
テスト時には X-Ray不要なので、それらをコメントアウトするなりで無効化すれば良いのですが、いちいちソースコードを書き換えるのは面倒です。
そこで、aws-xray-sdk
の読み込みを動的に切り替えるモジュールを作成します
my-xray.js
module.exports = (function () {
if (process.env.DISABLE_XRAY) {
// 環境変数 DISABLE_XRAY が定義されている場合、以下の mock オブジェクトを返す
const mock = {
captureAWS (obj) {
return obj
},
captureAsyncFunc (segmentName, asyncFunc) {
const mockSubSegment = {
close () { /* do nothing */ }
}
asyncFunc(mockSubSegment)
}
}
return mock
} else {
// 環境変数が定義されていない場合は通常通り aws-xray-sdk を読み込んで返す
return require('aws-xray-sdk')
}
})()
これまで aws-xray-sdk
パッケージを require していた箇所では代わりに my-xray
を require するように修正します。
.diff
- const awsXRay = require('aws-xray-sdk')
+ const awsXRay = require('./my-xray')
const AWS = awsXRay.captureAWS(require('aws-sdk'))
これで、mocha
などでテスト実行する際に環境変数を設定してあげれば X-Ray が無効化された状態でテストが実行できます。
$ DISABLE_XRAY=1 yarn run mocha