👏

Tips: 正規表現で楽するコントラクトテスト

2023/03/08に公開

今回はHardhatでコントラクトテストをする際に正規表現を用いるTipsを紹介します。

実はHardhatのテスト環境に用いられているchaiというライブラリでは文字列の代わりに正規表現を用いて、ある文字列が正規表現にマッチするかをテストする機能がついています。
なので、その機能を利用すると限定的ではありますが、テストをスマートに書くことができます。

実践してみよう

例えばOpenZeppelinのAccessControlコントラクトのロールが付与されていない場合のエラーは次のようなフォーマットです。

AccessControl: account アカウントアドレス is missing role ロールハッシュ

そして、あるテストで上記のフォーマットのエラーが期待される場合、愚直にコードを書くと次のようになると思います。

...
await expect(transasction).to.revertedWith(
     `AccessControl: account ${addres} is missing role ${roleHash}`
);
...

このテストを正規表現を用いて書いてみるとこんな感じにすることができます。

...
//ロールがなくてエラーが返されることが期待される。
const ERROR_MISSING_ROLE = 
    /AccessControl: account 0x(.*) is missing role 0x(.*)/;
await expect(transasction).to.revertedWith(ERROR_MISSING_ROLE);
...

このコードではAccessControlからのエラーを正規表現で表すことで、コードをスマートにしています。
何度も同様のエラーをテストする際は同じ正規表現を使いまわせるので、より効果を発揮すると思います。

終わりに

今回紹介したTipsを使えばちょっとだけイケてるコードをかけると思います。
この手法はどこでも使える、というわけではなく、世の中の大半のコントラクトのエラーは定数なので、そもそも正規表現を使うまでもないですが、頭の片隅に覚えていただければ幸いです。

Discussion