How to prevent mix test to start Application

Hello there!

First of all, I am a complete noob when it comes to Elixir, so the answer to this might be super basic but I need some help here!

I have an application with a supervision tree. In this tree there is a websocket client that will try to connect to a server when created. All good here, but the problem comes when I run mix test.

Running mix test apparently runs the supervision tree of my app and, obviously, my websocket client fails to connect to a server and triggers many errors.

Surprisingly my tests pass and mix test considers it a successful run, but I don’t because I don’t want all those error logs popping up on my CI!

The thing is, I don’t need this websocket client running tu run my tests. Any ideas what can I do here? And most important, why does the supervision tree starts on mix test?

Thank you!

There are a few options there:

  • write the children list of your app supervision tree to conditionally not start children that shouldn’t start in test environment.
  • configure your ws client to not log in test environment.
  • wrap your ws client around an adapter and mock it(using mox, probably) in tests.

I usually do the first one. using the configs for it. so my test.exs file has something like:

config :myapp, MyApp.SupChild,
enable: false,
...

and in the application.ex I have something like:

[
  Myapp.Repo,
  MyApp.Endpoint,
...
]
++
load(MyApp.SupChild)

where load/1 checks the application config for the enable key.

2 Likes

You can see that in action with phoenix, which starts the TCP parts of an endpoint only if configured to do so using config :my_app, MyAppWeb.Endpoint, server: true. mix phx.server is just a mix task enabling that config before starting the application. If the config is missing the “server” won’t be started.

2 Likes

Thank you that actually makes a lot of sense and its super simple! I did it and it worked yeah :smiley: