r11na

r11na

How to stop Supervisors starting GenServer during Exunit tests?

I’m having difficult figuring out how to stop supervisors running genservers during my tests and I haven’t found any helpful guides online.

I have the following setup in a test file:

setup do
  {:ok, server_pid} = Program.Myserver.start_link()
  {:ok, server: server_pid}
end

When I run my tests I get an
** (MatchError) no match of right hand side value: {:error, {:already_started, #PID<0.405.0>}}

No doubt because the supervisor has already started the genserver but I don’t know how to stop it doing this during my tests…

Any ideas on the best way to stop this?

Most Liked

michalmuskala

michalmuskala

Since Elixir 1.5 the recommened approach for starting processes in a test is to use start_supervised/2. This is an easy way to ensure the process is started and stopped together with the test process.

blatyo

blatyo

Conduit Core Team

What I typically do for this situation is set something like this in config/test.exs:

config :my_app, :env, :test

Then in my application supervisor, I separate out the processes I don’t want to start automatically and check the env.

children = [{MyApp.Endpoint, []), {MyApp.Repo, []}]

children = case Application.get_env(:my_app, :env) do
  :test -> children ++ [{MyApp.OtherThing, []}]
  _ -> children
end

Supervisor.init(children, strategy: :one_for_one)

If there’s a better way than this, I’m not aware of it.

SZJX

SZJX

It seems that the easiest way to solve it is just to start your GenServer under a different name, using the :name option? Though if your GenServer functions depend on a hardcoded :name such as __MODULE__ it would indeed making testing harder.

e.g. instead of writing

  def start_link(_) do
    GenServer.start_link(__MODULE__, :ok, name: __MODULE__)
  end

write

  def start_link(opts) do
    GenServer.start_link(__MODULE__, :ok, opts)
  end

and then the child spec:

      %{
        id: MyApp.MyGenServer,
        start: {MyApp.MyGenserver, :start_link, [[name: MyApp.MyGenServer]]}
      }

then in your test you can give a different name, e.g.

  setup context do
    _ = start_supervised!({MyApp.MyGenserver, name: context.test})
    %{producer: context.test}
  end
OvermindDL1

OvermindDL1

You just need to tear it down after, see another thread already talking about this at:

:slight_smile:

blatyo

blatyo

Conduit Core Team

The setup callback needs you to return one of those types. Like:

setup do
  start_supervised(CeresCore.Queue.Consumers.PaymentConsumer)
  :ok
end

The other issue appears to be that CeresCore.Queue.Consumers.PaymentConsumer.start_link/1 is not a function that exists.

Where Next?

Popular in Questions Top

srinivasu
How to handle excepions in elixir? Suppose i have A, B, C ,D, E modules. and each module has get() function. A.get() method will call th...
New
Werner
Hi, I’m using Ubuntu 18.04 and after updating to OTP-24.0 yesterday i have this warning when I run “mix local.hex”: 14:57:30.512 [warn] ...
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
Kagamiiiii
Student &amp; New to elixir. Nice language. I want to convert a english character, e.g. “a”, which is stored in a variable, to it’s asci...
New
lk-geimfari
What is most correct way to open, read and parse JSON file with poison? For example if we have example.json file in root of some projec...
New
Fl4m3Ph03n1x
Background Let’s assume I have a typical GenServer that receives messages as requests, does some operation in a DB and returns responses....
New
gonzofish
I’m currently trying to understand how to join three tables using Ecto. All the examples I’ve seen use 2, so maybe I’m just missing somet...
New
chewm
Hi guys, nice to meet you to the whole forum, I’m new here, I’m trying to configure visual studio code for elixir, right now the intellis...
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New
wernerlaude
In AR this is so simple @articles = current_user.articles How to do in Ecto? def index(conn, _params) do current_user = conn.assig...
New

Other popular topics Top

Qqwy
Update: How to use the Blogs &amp; Podcasts section You can post links to your blog posts or podcasts either in one of the Official Blog...
3268 119930 1237
New
shahryarjb
Hello, I get Persian date from my client and convert it to normal calendar like this: def jalali_string_to_miladi_english_number(persi...
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
977 41022 311
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New

We're in Beta

About us Mission Statement