Injexor provides an easy way to replace modules based on behaviours for mocking during tests or stubbing in another module based on config for different environments.
See the docs for full instructions: https://hexdocs.pm/injexor
The package can be installed by adding injexor
to your list of dependencies in mix.exs
:
def deps do
[
{:injexor, "~> 1.0.0"}
]
end
-
test.exs
config :injexor, default: Mock # adds Mock on the end of all modules by default # or you can alternatively register injects manually config :injexor, MyApp.MyBehaviour, inject: MyApp.Mock
-
test_helper.exs
Hammox.defmock(MyApp.Mock, for: MyApp.MyBehaviour)
-
lib/my_app.ex
defmodule MyApp do @behaviour MyApp.MyBehaviour def deploy_context() do Application.fetch_env!(:my_app, :deploy_context) end end
-
lib/my_app/my_behaviour.ex
defmodule MyApp.MyBehaviour do @callback deploy_context() :: atom() end
-
lib/my_app/module.ex
defmodule MyApp.Module do use Injexor, inject: [MyApp] def my_function do # you can now use mox/hammox to stub/expect this function to test the different paths if MyApp.deploy_context() == "production" do # do something else # do something else end end end