mmag

ハマったことメモなど

ExUnitAssertMatchっていうパッケージを書いた

hex.pm

伝わる人には伝わる言い方をすると、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に従ってこうしてます。

趣味プロジェクトで使いながら、色々追加してこうと思います。