Reputation: 17574
I have library that logs messages depending on the value of disable_logging
:
unless Application.get(:my_app, :disable_logging, false), do:
Logger.info("Hello World!")
Depending on MIX_ENV
I have a config for each setup:
#test.config
use Mix.Config
config :my_app, disable_logging: true
The issue here is that I don't want log messages all over my test results. So, naturally, I could set the disable_logging
to true and be done with it.
However, if I do it, I can't test whether or not the Logger is being called and if it's being called with the correct values:
So, given this I have some questions:
Upvotes: 0
Views: 389
Reputation: 75760
Why not keep using ExUnit.CaptureLog
to suppress the logs and just discard the result?
If you have a large number of tests that log to console and don't want to do that for all of them, you can create a custom ExUnit tag
, combined with @Aleksei's answer, that does it for you.
In your ExUnit.Case
template, add this:
setup tags do
if tags[:disable_logger] do
Application.put_env(:my_app, :disable_logging, false)
on_exit(fn ->
Application.put_env(:my_app, :disable_logging, true)
end)
end
:ok
end
Now you can just specify the tag for the tests you want logging disabled for:
@tag disable_logger: true
test "something happens" do
# ...
end
Note: You will encounter issues with this if you run your tests asynchronously
Upvotes: 1
Reputation: 121000
Declare ExUnit.setup/1
with a mandatory ExUnit.on_exit/2
to set the environment variable with Application.put_env/4
.
setup do
Application.put_env(:my_app, :disable_logging, false)
on_exit fn ->
Application.put_env(:my_app, :disable_logging, true)
end
:ok
end
I did not test it, but it should work.
Upvotes: 1