oliveiragahenrique

oliveiragahenrique

Doctest that perform I/O operations

I’m building a very simple application, every time you call ModuleX.get(id) the system perform the folowing actions:

  1. Search for id on database
  2. If sucess, return the id’s related value
  3. Otherwise create a default data structure and save it on the database under the id key

The problem is my docTests are failing because I use the same id on all of them. Because of it, operations on former tests impact on the result of the later ones, because of the data was persisted

Questions:

  1. Am I using doctests wrong?
  2. There is a way to perform a delete operation after each doctest?
  3. How did you guys would approach this problem?

Marked As Solved

oliveiragahenrique

oliveiragahenrique

I managed to make it work using the setup macro as following:

  setup do
    # Get the pids of all currently alive processes
    accounts_used_pids =
      DynamicSupervisor.which_children(Account.Cache)
      |> Stream.map(fn entry ->
        case entry do
          {_, pid, :worker, [Account.Server]} -> pid
          _ -> nil
        end
      end)
      |> Enum.filter(fn ele -> ele !== nil end)
    
    # Terminate all processes
    Enum.each(accounts_used_pids, &Process.exit(&1, :clean_up))
    
    # Reset the "database"
    File.rm_rf(Account.Database.folder_path())
    File.mkdir_p!(Account.Database.folder_path())

    :ok
  end

The setup macro runs the code inside it after each test case. So I clean up the database and terminate all processes related to the account, after every test case.

It might not be the optimal solution, but work for me! Thank you so much for the help!

Also Liked

ityonemo

ityonemo

  1. this seems very ambitious for a doctest.
  2. are you using ecto sandboxes? I’m not 100% sure, but It should clean up after each doctest group. Try separating each of your cases into distinct ``` groups.
qhwa

qhwa

  1. No, there’s nothing wrong with it.
  2. Yes, as mentioned by @ityonemo, Ecto’s sandbox adapter helps. What’s inside your test/test_helper.exs ?

Where Next?

Popular in Questions Top

Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New
yawaramin
In the Dialyzer docs ( http://erlang.org/doc/man/dialyzer.html#requesting-or-suppressing-warnings-in-source-files ), there is a way to tu...
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
Kagamiiiii
Student & 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
gazoon
I want to know absolute current module path. In python i could do that: os.path.abspath(__file__) Does elixir have anything similar?
New
vac
Hi, I'm quite new in Elixir and I'm trying to format a string to a PEM format. I have the certificate value like MIIDBTCCAe2...... and ...
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
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
sabri
Can someone explain the settings of pool_size of Ecto in config file? and what is the recommend size? Thanks
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New

Other popular topics Top

freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
peerreynders
Manning 2016 Halloween weekend sale via Deal of the Day Friday, October 28 - Half off all MEAPs - code WM102816LT Saturday, October 29 ...
326 29600 154
New
senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New
jerry
Good day to you all. I have been struggling to get a query involving like and ilike to work. Can anyone assist me on this, please? pro...
New
AstonJ
You’re a programmer, so you don’t need spoon feeding with the conventional drivel about “this is an integer.” No. You need to know what’s...
New
malloryerik
Hi, this is for people who, like me, have had some friction using .html.heex templates in VSCode. The solution seems to be, in a hyphena...
New
quazar
How to set Jason to encode all fields in ecto schema, I don’t care about security and implementing only is taking long list of attributes...
New
vac
Hi, I'm quite new in Elixir and I'm trying to format a string to a PEM format. I have the certificate value like MIIDBTCCAe2...... and ...
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
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

We're in Beta

About us Mission Statement