elixirex-unit

Elixir doctest fails for function that returns random values


I have a function in Elixir that produces three random RGB tuples in a list.

defmodule Color do



  @doc """
  Create three random r,g,b colors as a list of three tuples

  ## Examples

      iex> colors = Color.pick_color()
      iex> colors
      [{207, 127, 117}, {219, 121, 237}, {109, 101, 206}]

  """
      def pick_color() do
        color = Enum.map((0..2), fn(x)->
          r = Enum.random(0..255)
          g = Enum.random(0..255)
          b = Enum.random(0..255)
          {r, g, b}
        end)
end

When I run my tests, my doctests fail. The resulting list of tuples are different than what is defined in my doctest. How can I write a doctest for a function that returns a random value?


Solution

  • In order to test a function with doctests, you must be able to predict the output of your function. In this case, you can't predict the output of your function.


    However you could test your function with regular tests.

    Here is a test that would make sure Color.pick_color() produces a list of 3 tuples, using pattern matching:

    test "pick color" do
      [{_, _, _}, {_, _, _}, {_, _, _}] = Color.pick_color()
    end
    

    You could also check if each value is between 0 and 255, etc.