ExUnitAssertMatchっていうパッケージを書いた
伝わる人には伝わる言い方をすると、https://github.com/r7kamura/rspec-json_matcherみたいなことがしたい。
例えばPhoenixのコントローラのテストとかで、レスポンスのJSONの形式をテストしたいときに
assert json["user"]["name"] == "John" assert json["user"]["age"] == 28 assert json["user"]["orgs"][0]["name"] |> is_binary()
とか全部書くのダルいし、もうちょいどんなJSONを求めてるのかわかるようにしたかった。あとElixirのパッケージ最近書いてなくて、リハビリしたかったというのもモチベーションの1つ。最初はマクロで実装しようと考えて書き始めたけど、そのまま機能追加してメンテしていく自信がなくなったのでやめて、以下のようになりました。
alias ExUnitAssertMatch, as: Match expected = Match.map(%{ "user" => Match.map(%{ "name" => Match.literal("John"), "age" => Match.literal(28), "orgs" => Match.list_of( Match.map(%{ "name" => Match.binary(), }) ), }), }) Match.assert expected, json
気をつけた点としては
use
させない- Configつかわない
です。マクロやめたのでuse
はまぁしないっしょというのはありつつ、他のパッケージのコードにuse
が入ってると結構コード読みづらくなるなーという実感があるので、自分がつくるものではやらんようにしよーというもの。Configややこしい問題はhttps://elixirforum.com/t/proposal-moving-towards-discoverable-config-files/14302とかhttps://elixiroutlaws.com/1でも言われていて、徐々に解決されていきそうだけど避けるようにしている。今回のパッケージはテストのときのためのものなので大して関係ないけど、設定っぽいものは引数で渡せるようにしてます。ex_unit_assert_match
って名前は長いなと思ったけど、https://hex.pm/docs/publish#naming-your-packageに従ってこうしてます。
趣味プロジェクトで使いながら、色々追加してこうと思います。