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.

Last Post!

michaelfich

michaelfich

Thank you for the feedback. Very much appreciated!

Where Next?

Popular in Questions Top

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
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
aalberti333
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this: ...
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
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
svb
Hi! Currently I want to submit a form by pressing the Enter key. However, since my input field is of type “textarea” this is just adds a...
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

Other popular topics Top

vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
grych
Hi folks, Few months ago I have announced the proof-of-concept of the library to manipulate the browsers DOM objects directly from Elixi...
639 54260 488
New
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
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
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
AstonJ
Posting this to see if we can make things easier for people to get into Neovim. If you use Neovim and have a favourite distro please let ...
New

We're in Beta

About us Mission Statement