Seed file not loading factory dependency

Any suggestions on how to load dependency of factory in seeds file?

factory.ex

alias Test/Utils/TextGenerator

def post_factory(attrs \\ %{}) do
%Post{
      body: TextGenerator.text_fake()
}
end

seeds.exs


{factory, _} = Code.require_file("factory.ex", "./test/support/") |> hd()

alias Blog.Posts

{time, _} =
  :timer.tc(fn ->
    tasks =
      Enum.map(1..100, fn _ ->
        Task.async(fn ->
post =
            factory.post_factory
            |> Map.from_struct()

          Enum.each(1..100, fn _ -> Posts.create_post(post) end)

 end)
      end)

    Task.await_many(tasks, 20_000)
  end)

This is the error I get…

** (UndefinedFunctionError) function Blog.Utils.TextGenerator.text_fake/0 is undefined (module  Blog.Utils.TextGenerator is not available)
    Blog.Utils.TextGenerator.text_fake()
    test/support/factory.ex:23: Blog.Factory.post_factory/1
    priv/repo/seeds.exs:34: anonymous fn/1 in :elixir_compiler_1.__FILE__/1
    (elixir 1.11.3) lib/task/supervised.ex:90: Task.Supervised.invoke_mfa/2
    (elixir 1.11.3) lib/task/supervised.ex:35: Task.Supervised.reply/5
    (stdlib 3.14) proc_lib.erl:226: :proc_lib.init_p_do_apply/3
Function: #Function<2.133263724 in file:priv/repo/seeds.exs>
    Args: []

A typical approach with using factory-ish files in seeds.exs is to include test/support when compiling in dev:

  defp elixirc_paths(:test), do: ["lib", "test/support"]
  defp elixirc_paths(:dev), do: ["lib", "test/support"]
  defp elixirc_paths(_), do: ["lib"]

(normally only :test includes that directory)

This should avoid any need to manually invoke Code.require_file.

2 Likes

This did work but it would make all the files in test/support or just even the required files available everywhere in dev with an import or alias. Since it is required only in seeds.ex, is there way to have dependencies only in the file, and not the path?

Since Code.require_file can require only one file, is there any other function that will support multiple files in my case here?