fireproofsocks
I’ve got a simple app that starts up a supervised Broadway pipeline. This is fine for regular use, but it makes testing difficult:
def start(_type, _args) do
children = [{My.Pipe, []}]
opts = [strategy: :one_for_one, name: My.Supervisor]
Supervisor.start_link(children, opts)
end
I’m wondering if there’s a way to re-start the process with different options specifically for testing? I would like to send some different options to the start_link/1 function specifically to help override things for testing.
Is this possible? Or should I rely instead on using Application.put_env/3 to modify settings at (testing) runtime?
Trending in Questions
I’m aware of 2 such projects, are there others?
git: GitHub - team-alembic/realworld: A fullstack Phoenix LiveView application with back...
New
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
Hi everyone.
My team and I have been working on a fairly modest app based around video streaming and chat, but we’ve landed a customer t...
New
I really like the adapter patterns that ecto, nebulex, waffle, etc. use and would love find something similar for a key management servic...
New
Hello folks!
So at work, we are seeing some situations where we have to define some “fixed” strings that are used across the codebase in...
New
How Can I Optimise Compile Time Dependencies
I have been building an elixir application for about 2 years now. Many modules and files ha...
New
Other Trending Topics
A little off-topic, but I feel like people here have a good head on their shoulders.
I used to be quite good at making software. Was luc...
New
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
I love Elixir. It’s one of 2 programming languages I’ve ever fallen in love with.
But I don’t use it anymore.
Serverless was the promis...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #ai
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #blog-post
- #elixirconf-us
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #elixirconf-eu
- #api
- #forms
- #security
- #metaprogramming










Showing Posts 1 to 10- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
Nicd
You could check the mix env:
idi527
But beware that mix is not available in releases.
Sorry, misunderstood your problem, please ignore the suggestion below
I’d consider usingLostKobrakai
I tend to avoid testing processes started by the applications supervision tree. I start a separate (set) of them manually and without global naming and pass the pid around to tests. This way I often get the ability to run tests async as well.
idi527
I’m not sure how well known it is, but there’s start_supervised/2 for the approach described by @LostKobrakai.
fireproofsocks
I’m not sure if I follow how you’d do this… when I try to (re)start the Broadway pipeline for testing, e.g.
I get an error:
Likewise, I can’t figure out the syntax required to make the
start_supervisedoption work.Returns
{:error, {{:EXIT, {:undef, ...Same for:
Am I close?
fireproofsocks
That would work in a pinch, but it pegs all options to the environment, and the tests need to vary the options in order to fully test the results…
Qqwy
A clean way to do this is to just bake the possibility to switch to the special testing settings into your code.
One possibility would be to add one (or a few) optional arguments that can override the ‘default’ settings that are used.
The advantage on this over relying on
Application.get_env/put_envis that it is completely separate between test-cases (it is ‘functionally pure’). This helps reasoning about the tests, but also e.g. allows your tests to run concurrently.fireproofsocks
That’s the route I’m going down… but I still don’t see room for overrides when the process has already started BEFORE I execute my test code.
For example, if I want to override a callback that would normally query an external API with a mock callback that mimics a bad response from the API, I can do that in an individual function by using
Application.get_env/put_env/3… but when those options need to be overridden inside thestart_link/1implementation and the process is already started… there isn’t a way to override the behavior. Even making use ofBroadway.DummyProduceris pretty difficult when the process has already been started.So I feel like I’m running around in circles. It feels like there is a way to do this, I just can’t make enough sense of the docs to pull the rabbit out of the hat.
fireproofsocks
I think I found one way of working with this based on this post.
First was to make the Broadway
:nameoption overrideable by usingKeyword.get/3with a default value:Then I can pass a unique
:nameoption to my pipeline when I callstart_supervisedin my test:and it works equally well when I call
start_link/1directly:This works and I will probably use this method… the only downside I can see is that the regular built-in process in the application’s supervisor always starts… but we kinda just ignore it. That’s not a problem for my use case, however.
I think the docs for https://hexdocs.pm/ex_unit/master/ExUnit.Callbacks.html?#start_supervised/2 need some updating because they don’t really explain how to work with this common use case… I’m not sure what I did is even the proper way to work with that function… it just feels like a work-around more than anything else. Thoughts?
idi527
Just in case, here’s how I’d use
start_supervised. Not sure if it addresses the problem.Relevant bits: