Open2

Elixir PhoenixでTrait(FactoryBot Trait)ライクを使うための習作

利用イメージ

  • user_fixture([:japanese])
  • user_fixture(email: "test@example.com")
  • user_fixture([:japanese, email: "test@example.com"])
  • user_fixture([:japanese, :male, email: "test@example.com"])

共通定義

defmodule DataTrait do
  def trait do
    quote do
      defp trait(obj, []), do: obj

      defp trait(obj, [head | tail]) when is_atom(head) do
        _trait(obj, head) |> trait(tail)
      end

      defp trait(obj, list) do
        obj
        |> Map.merge(Map.new(list))
      end

      defp _trait(obj, :touch), do: obj
    end
  end

  defmacro __using__([]) do
    apply(__MODULE__, :trait, [])
  end
end

fixtureモジュール側

defmodule UsersFixtures do
  use DataTrait

  def user_fixture(traits \\ []) do
    %User{}
    |> trait(traits)
    |> Repo.insert!()
  end

  defp _trait(user, :japanese),
    do: Map.put(user, :language, "japanese")

  defp _trait(user, :man),
    do: Map.put(user, :sex, "male")
end
  • 実用に耐えそう...?
  • 複雑なパターンはおとなしくuser_hoge_fixture()で分ける
ログインするとコメントできます