xgeek116

xgeek116

Mox is ignoring my Mocked module and calling the real function

I’m using using mox to help me with my unit testing (for now, I want to mock a function that fetches external API).

my mix.exs :
{:mox, "~> 1.0", only: :test}

My test_helper.exs :

ExUnit.start()

Mox.defmock(MyApp.MockExternalSources, for: MyApp.MyModule.ExternalSources)

My module code (MyApp.MyModule.ExternalSources) :

defmodule MyApp.MyModule.ExternalSources do

    @callback http_get_resource(url :: String.t(), headers :: list()) :: {:ok, map()} | :error
    @callback fetch_one_external_resource(params :: map()) :: map()
  
    require Logger
  
    def fetch_one_external_resource(params) do
      with {:ok, data} <-
        http_get_resource(params["url"], params["headers"]) do
        do_something(data)
      else
        :error -> %{}
      end
    end
  
    def http_get_resource(url, headers) do
      case HTTPoison.get(url, headers) do
        {:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
          {:ok, Poison.decode!(body)}
  
        {:ok, %HTTPoison.Response{status_code: 404}} ->
          :error
  
        {:error, %HTTPoison.Error{reason: _reason}} ->
          :error
      end
    end
  end

And my test module :

defmodule MyApp.MyModule.ExternalSources.Test do
  use ExUnit.Case, async: true
  import Mox

  setup :verify_on_exit!

  test "fetch and process external data" do

    MyApp.MockExternalSources
    |> expect(:http_get_resource, fn _url, _headers ->
      {:ok, %{status_code: 200, body: %{key1: "value1", key2: "value2"}}}
    end)

    params = %{
      "url" => "xxx",
      "headers" => "yyy"
    }

    assert MyApp.MyModule.ExternalSources.fetch_one_external_resource(params) ==
             %{"new_key1" => "value1", "new_key2" => "value2"}
  end
end

But I always get a failed assertion and the behaviour is that the right value (MyApp.MyModule.ExternalSources.fetch_one_external_resource(params)) is actually calling the external API and getting the real values ignoring my static data in the mock (%{key1: "value1", key2: "value2"})

Any help please !

Most Liked

dorgan

dorgan

Or you could just use Patch :wink:

Where Next?

Popular in Questions Top

joaquinalcerro
Hi there, I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 record...
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
tduccuong
Hi, is there any work on GUI with Elixir, that is similar to Electron/Javascript? My idea is to bundle Phoenix and BEAM into a single se...
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
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
myronmarston
The Elixir Typespec docs show the following syntax for keyword lists in typespecs: # ... | [key: type] # keyword lis...
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
chensan
I have a User schema with a :from_id field set to type :string: defmodule TweetBot.Repo.Migrations.CreateUsers do use Ecto.Migration ...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers' Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
idi527
I’ve been re-reading swift book again and noticed that multiline strings there don’t have a trailing line break, unlike in elixir iex(2)...
New

Other popular topics Top

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
sergio
In Ruby, I can go: User.find_by(email: "foobar@email.com").update(email: "hello@email.com") How can I do something similar in Elixir? ...
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
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
fayddelight
I tried installing elixir 1.11.2 erlang 23.3.4 via asdf in my zsh shell. Enabled the versions locally and globally. When I list them ...
New
msaraiva
Surface is an experimental library built on top of Phoenix LiveView and its new LiveComponent API that aims to provide a more declarative...
564 42633 214
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
beno
I will often find my self writing things similar to: case some_value do nil -&gt; something() "" -&gt; something() _ -&gt; someth...
New
lucidguppy
I have a super simple question about elixir - how would I take a file like this foo bar baz and output a new file that enumerates th...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New

We're in Beta

About us Mission Statement