stratacast

stratacast

Doctests with PIDs in output from iex

Hey everybody! I’m coming back at Elixir again after maybe a year of not being able to jump into my web development hobby. I wanted to get back into Elixir from the ground floor again so I’ve been relearning this last week. I jumped into this starter project from Jose

https://howistart.org/posts/elixir/1/

And one of the things he mentions is creating docs and doctests. So I have been. I ran into one issue though and can’t find an answer anywhere. And that is when trying to test a function that has a Tuple with an atom and PID as the output. For example with creating an Agent:

iex> {:ok, pid} = Agent.start_link(fn -> [] end)
{:ok, #PID<0.106.0>}

as a part of the document to be tested with doctest. With the function transfer in the example in the introduction I created a doc like so:

  @doc """
  Starts transferring `data` from `left` to `right`.

  ## Parameters

  - `left` - A portal shot with Portal.shoot/1
  - `right` - Another portal shot with Portal.shoot/1
  - `data` - An enumerable type of data

  ## Examples

      iex> Portal.shoot(:red)
      {:ok, pid}
      iex> Portal.shoot(:green)
      {:ok, pid}
      iex> portal = Portal.transfer(:red, :green, [1,2,3])
      #Portal<
             :red <=> :green
        [1, 2, 3] <=> []
      >
      iex> portal
      #Portal<
             :red <=> :green
        [1, 2, 3] <=> []
      >
  """

If I remove the {:ok, pid} for example, it compares the wrong things in the doctest:

  1) doctest Portal.transfer/3 (1) (PortalTest)
     test/portal_test.exs:3
     Doctest failed
     doctest:
       iex> Portal.shoot(:red)
       iex> Portal.shoot(:green)
       iex> portal = Portal.transfer(:red, :green, [1,2,3])
       "#Portal<\n       :red <=> :green\n  [1, 2, 3] <=> []\n>"
     code:  inspect(portal = Portal.transfer(:red, :green, [1, 2, 3])) === "#Portal<\n       :red <=> :green\n  [1, 2, 3] <=> []\n>"
     left:  "#Portal<\n       :red <=> :green\n  [1, 2, 3] <=> []\n>\n"
     right: "#Portal<\n       :red <=> :green\n  [1, 2, 3] <=> []\n>"
     stacktrace:
       lib/portal.ex:19: Portal (module)

Thoughts? Workarounds?

Marked As Solved

stratacast

stratacast

Okay, I had a friend help me out. And it was pretty relevant to what @al2o3cr was saying about the newline being added. In the project, you are asked to output to a heredoc to get the output shown. The code was originally this:

    """
    #Portal<
      #{String.pad_leading(left_door, max)} <=> #{right_door}
      #{String.pad_leading(left_data, max)} <=> #{right_data}
    >
    """

And he wrapped it with String.trim which removed the newline escape character. So the change to the code itself was:

    String.trim("""
    #Portal<
      #{String.pad_leading(left_door, max)} <=> #{right_door}
      #{String.pad_leading(left_data, max)} <=> #{right_data}
    >
    """)

And the doctest example being

  ## Examples

      iex> Portal.shoot(:red)
      iex> Portal.shoot(:green)     
      iex> portal = Portal.transfer(:red, :green, [1,2,3])
      #Portal<
             :red <=> :green
        [1, 2, 3] <=> []
      >
      iex> portal
      #Portal<
             :red <=> :green
        [1, 2, 3] <=> []
      >
  """

Noting the removal of {:ok, pid} after the iex prompts that run Portal.shoot(color)

Also Liked

al2o3cr

al2o3cr

I couldn’t find an official “don’t put a newline at the end of your inspect output” in the docs, but note that the examples for Kernel.inspect/2 don’t, even in the case when there are embedded newlines in the result.

Where Next?

Popular in Questions Top

dotdotdotPaul
Okay, I'm having a heck of a time trying to figure out how to best handle the validation of belongs_to associations in Ecto. I'm sure I'...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
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
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
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
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
mgjohns61585
Could someone help me? I'm making my first elixir program, number guessing game. I can't figure out how to convert the user's guess from ...
New
LegitStack
I’m trying to make a websocket server in Phoenix or raw Elixir. I heard about gun, I think I could use cowboy, but since I’m not that sma...
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

JDanielMartinez
Hi! May someone helps me, please! I have two apps into an umbrella project: the first one is Database, which manages queries, and the se...
New
itssasanka
Hi all, Trying to get some more clarity over utc_datetime and naive_datetime for Ecto: https://hexdocs.pm/ecto/Ecto.Schema.html#module-...
New
ycv005
I have followed this StackOverflow post to install the specific version of Erlang. And When I am running mix ecto.setup then getting fol...
New
fireproofsocks
I’m working on defining a simple Ecto schema for a table (in PostGres), but I don’t see where I can define a column as NOT NULL. Conside...
New
script
If I have a string “1000 cfu/ml” . I want to remove the characters and / and space . So the string is like this "1000" What is the ...
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
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID&lt;0.412.0&gt; terminating ** (Postgrex.Error) FATAL...
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New

We're in Beta

About us Mission Statement