Question on :application.get_key(:my_app, :module)

As I understand :application.get_key(:my_app, :module) lists all of compiled modules under the :my_app application. I have a question when we create a module during runtime. The created module is not listed as a result of running application.get_key(:my_app, :module)

Please see the case before -

defmodule MyAppTest do
  use ExUnit.Case
  doctest MyApp

  test "get modules" do
    defmodule MyApp.A do
      def a(), do: "a"
    end

    assert "a" == MyApp.A.a() # This one works

    {:ok, modules} = :application.get_key(:my_app, :modules)
    assert MyApp.A in modules # Why this line is failing. How can I get all the compiled modules at this time?

    after
    purge(MyApp.A)
  end

  defp purge(module) do
    :code.delete(module)
    :code.purge(module)
  end
end

Are there any other functions to fetch for the compiled modules at the current time?

I am doing as above, I only want this module during the test time and only for this specific test, i.e, I don’t want this module to be available during running other tests.

The list returned from :application.get_key/2 is compiled from the applications manifest, which again is created by mix.

Runtime created modules do not belong to any application, and as far as I remember there is no way to get a list of them.

Though you might be able to use :code.all_loaded/0 to get a list of all currently loaded modules.

1 Like

@NobbZ

Thank you for recommending of using :code.all_loaded/0. After I tried, I am seeing that some of modules that we got from :application.get_key(:my_app, :module) are still missing in the :code.all_loaded/0 also.

From what I understand that all module list that we get from :application.get_key(:my_app, :module) for a specific application should always exist in :code.all_loaded/0 also. But it is not.

Enable embedded mode in your mix.exs and try again. The default is to lazy load modules. Embedded mode will load all modules at VM boot time.