michaelfich

michaelfich

Testing ExAws.stream! with Mox

I’ve been working with a function that looks similar to the one that I’ve described below. It works adequately in practice but trying to unit test it has been a challenge to this point.

lib/my_module.ex

defmodule MyApp.MyModule do
  def my_func do
    "my-s3-bucket"
    |> ExAws.S3.list_objects_v2(prefix: "path/to/files")
    |> ExAws.stream!()
    |> Enum.map(&do_work/1)
  end
end

I’ve currently set up ExAws like the code samples below for mocking out ExAws.request! calls.

config/test.exs

config :my_app, :ex_aws,
  http_client: ExAws.Request.HttpMock

test/support/mocks.ex

Mox.defmock(ExAws.Request.HttpMock, for: ExAws.Request.HttpClient)

If anyone has suggestions for how to make the Mox.expect/4 call here properly set up the ExAws.stream! call, that would be greatly appreciated.

test/my_module_test.exs

defmodule MyApp.MyModuleTest do
  use ExUnit.Case, async: true

  import Mox

  setup :verify_on_exit!

  describe "my_func/0" do
    test "mocks api call(s)" do
      # how do we mock the stream?
      expect(ExAws.Request.HttpMock, ..., fn ..., ... ->
        # unsure
      end)

      assert [_ | _] = my_func()
    end
  end
end

Marked As Solved

benwilson512

benwilson512

Author of Craft GraphQL APIs in Elixir with Absinthe

To mock at the HTTP layer you need to return a response shape that is the same as what AWS itself returns. the stream function is just making repeated object list calls with a cursor, so you’ll need to return that shape.

I don’t however recommend mocking at this layer. You’ll spend more time trying to make ExAws internals work. Rather I would make an internal FileStore behavior in your app and then have a mock of that which can return a stream directly.

Also Liked

LostKobrakai

LostKobrakai

That – but also if you eventually want to run integration tests you can consider pointing it against minio or localstack instances.

Where Next?

Popular in Questions Top

lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
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
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
openscript
Hello! Sorry for this astonishing simple question, but I’m really stuck. I try to set up the intellij-elixir plugin, but I don’t know ho...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
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
Phillipp
Hey, I have a NanoPi-M3 and try to install Elixir on their Ubuntu image. I followed the Raspberry Pi installation instructions from the ...
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
jc00ke
Expanding on this topic: https://forum.elixirforum.net/t/map-typespec-question/19217 Let’s say I have a map with required and optional k...
New

Other popular topics 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
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New
Tee
can someone please explain to me how Enum.reduce works with maps
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
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
sacepums
Hey guys. I'm new to elixir and im really stocked about it. But I ran into a bit of problem - I need to convert a date sting, for examp...
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
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
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
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New

We're in Beta

About us Mission Statement