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()
で分ける
ログインするとコメントできます