D4no0
I have a project where we do http requests to public domains.
I am currently using Mox for testing and following their practices by having a callback for the http client and a implementation:
defmodule HttpClient do
@callback request(atom(), binary(), binary(), keyword(), keyword()) ::
{:ok, HttpClient.Response.t() | HttpClient.MaybeRedirect.t()}
| {:error, any()}
end
While it works great for tests with mocked data, I still find that these tests are double edged, as they are fully dependent on the correctness of data and format of it, we already had cases where the tests would pass and the application would fail at runtime.
I was wondering if maybe replacing this kind of mocked tests with a real local http server (similarly to how ecto uses sandbox) that exhibits real properties would be better and make for cleaner and easier to manage tests.
Any thoughts on this or tools you could recommend?
Trending in Questions
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
Documentation
While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
Hello,
I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
Hi everyone,
I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding.
I sta...
New
So my question is quite simple and i have found no conclusive answer on forum, google or AI.
Should we use :erlang.float for Integer to ...
New
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
I’m new to elixir and just tried to install the elixirLS extension for VScode(ium) and it is throwing some errors that I would like help ...
New
Other Trending Topics
Edit: 2026 May 15 - This post is archived.
Mob is alive!!
Main docs: mob v0.7.11 — Documentation
A bit of explanation for the slightly c...
New
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
I am happy to introduce the very α version of the new programming language compiled to BEAM.
Welcome Cure.
It has literally three kille...
New
Hobbes is a low-level distributed database for the Elixir programming language.
Hobbes provides a simple, safe, and scalable storage lay...
New
Hi everyone!
The first release candidate for the Expert language server project is now available!
We’ve published a press release detai...
New
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
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
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ai
- #ecto-query
- #elixirconf-us
- #blog-post
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #elixirconf-eu
- #api
- #forms
- #metaprogramming
- #hex










Showing Posts 1 to 10- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
hst337
Bypass
I would recommend Patch for everybody. It is universal and more friendly solution.
This is caused by different data in tests and in reality. You can just copy-paste data from real responses and use it on testing. Or you can even use solutions like ExVCR
Anyway, final decision depends on amount of time you have and what quality of tests you want
D4no0
I don’t care that much, whatever gets the job done.
This is what we are doing, however I think it is highly unproductive and error prone in the long run, the tests are brittle, the only thing they have going is the speed as it is not doing any IO.
OK, now this is something I was looking for! We are dealing with a wide variety of possible responses, so having the ability to collect them with time is exactly what we needed! I was thinking at some point to implement a similar custom solution, great that I don’t have to anymore.
Thanks, I think we will end up using
ExVCRin the future for local tests.As for E2E tests, I think that a custom server will be in order, as we have more things like tls and certificates checking in play.
hst337
Beware: VCR solutions are hard to maintain
D4no0
How so? I am mostly interested in custom cassettes option, that ideally would be recorded manually.
I guess if this gets nasty it could be as well replaced with a mix of a sqlite database + some utilities to fetch and record the http responses.
hst337
D4no0
Good heads up, this can indeed can become a problem!
Now this sucks. I still like the idea of recording the responses in some kind of DB, as writing them in a file or source code manually is just not very manageable. I guess more research is in order, as this does not seem to be a trivial task.
dimitarvp
I get it that it might not be scalable to manually collect all of the API responses but I have used ExVCR in the past and ended up… manually collecting all the API responses that I needed for tests. The API had slight changes – 3 times in a single year – but it was enough to piss us off because we shipped non-working features in production due to outdated cassettes.
So we rolled up our sleeves and what do you know, something like 70 API responses took 3 people 5-6 work days (and we were not doing only that, it was just an ongoing effort). Not a huge deal, though granted it’s annoying to do.
So I am with @hst337 here – take control of this.
Of course nobody is stopping you scripting this somewhat. I was able to devise a small text file format a while ago (next time I needed something like this) and just have a bash/zsh script loop over the lines inside the file and do
curlrequests and record the responses. Took me 80% the way there (though it was super specific and was not generalizable).D4no0
Indeed, from the looks of it, this library is very specific, I would guess it would come in handy for testing microservices, where you could host locally all the instances and record their contracts.
I am thinking that using something like a sqlite database to record all the responses should be times more manageable, both in terms of debugging and editing, on elixir side you have ecto and you can edit/view it manually with any sql client. Not a bad idea for a possible future library, as this can be extended beyond http.
dimitarvp
Yep, you can very easily end up writing the next ExVCR that way. I’ve known a bunch of programmers who would have done it but couldn’t be bothered beyond doing the task at hand at the time – count me as part of that group.
pdgonzalez872
Good question. Here are my 2c:
I’ve seen that VCR and the likes “feel” great but as folks here pointed out, they get outdated. It’s a picture/snapshot in time saying that things may have worked given a certain set up you had. A green VCR test doesn’t give me confidence, unfortunately. Much like a test that relies only on Mox/unit tests.
Bypass works well, but I personally feel like the tests are too complex. That’s just my preference, I’m a simple person
Even when the tests are done correctly, I don’t have good confidence from a successful test run.
I’ve seen projects that leverage their own http server and I personally dislike those. It’s a layer of complexity that I haven’t seen yield good returns in practice, but that may be biased to my experience (as all of the points in this answer by the way).
What gives me the most confidence is having
integrationtests that exercise the live implementation and you need to load the correct keys and such, just like Dashbit discusses here:@moduletagor multiple@tags. So, ci runs will just exercise the boundary and args (your Mox unit tests).This setup has given me (and a few teams) the most confidence when working with things we don’t fully control (when we should use Mox). I’ve personally seen:
Downsides: Usually these tests hit test environments/sandboxes, which in turn are NOT prod. Even though these have given me the most confidence, you can still get little surprises in prod. As usual, make sure you have log and metrics to give yourself a better shot of handling the surprises, because they will come
I’ve also seen a successful mix of Bypass and
integrationtests: avalanche/test/integration_test.exs at main · HGInsights/avalanche · GitHub. Even though there is no switch there (there is no live impl for Avalanche) but we achieve theintegration/livetests by not intercepting the request. It works well in this case.PS: Oh, I mention
integrationtests and I realized that this is an overloaded term. Much like amock→ in some contexts/communities means something to some people and others it’s different. So maybe a better name for these tests would belive unit tests, but naming things is hard.