Closed1

Jestとethers.jsで「TypeError: Do not know how to serialize a BigInt」で怒られる

serinuntiusserinuntius

問題

ethers.jsとJestでテスト書いてたら怒られた。
(まだJest使ってんのとか、まだether.js使ってんの?ってはってのは一旦おいておいてw)

  ● Test suite failed to run

    TypeError: Do not know how to serialize a BigInt
        at stringify (<anonymous>)

      at messageParent (node_modules/jest-worker/build/workers/messageParent.js:29:19)

環境

  • ethers.js: 6.7.1
  • Jest: 29.7.0

解決策

  • Jestのconfigに workerThreads: true, を足す
    • なんでこれで解決するのかは全くわかっていない

解決に至った経緯

ethers.jsの6のバグだと最初は思っていた
そういう記述もあるし、ただ6.3以上なら治ってるよ〜って書いてて、謎だった。

そのIssueに書いてあったパッチの

// @ts-expect-error 🚧 ETHERS 6.1.0 IS BROKEN. THIS IS A WORKAROUND
BigInt.prototype.toJSON = function () {
  return this.toString()
}

も試したが効果がなかった。

露頭に迷っていた。

BigIntって書いてあったから、思考停止で ethers.js を疑っていたが、スタックトレース見るとJestのバグじゃないかと思った。

JestのIssue見たらビンゴ!!!
https://github.com/jestjs/jest/issues/11617#issuecomment-1458155552

何個かこれで治ったっていう報告があるが、自分は効果なかったやつもちらほら。

最終的に効いたのは、 workerThreads: true, だった。

参考文献

https://github.com/ethers-io/ethers.js/issues/4005#issuecomment-1745828229
https://github.com/jestjs/jest/issues/11617#issuecomment-1458155552

このスクラップは2023/10/23にクローズされました