For those who are still wondering, yes it’s possible to use mock with ExAws without wrapping ExAws.request/2 in another module in order to mock it.
To do so, I read how they are testing their own module : ExAws Github
In fact, they are mocking the HTTP client underneath.
We can do exactly the same thing and mock the HTTP client in our tests.
In the business logic code:
...
response =
bucket_name
|> S3.get_object(filename_path)
|> ExAws.request(get_ex_aws_request_config_override())
...
def get_ex_aws_request_config_override,
do: Application.get_env(:ex_aws, :request_config_override)
config.exs:
...
config :ex_aws,
...
# note: it's a custom config, ex_aws will not take it in account directly
request_config_override: %{}
...
test.exs:
...
config :ex_aws,
request_config_override: %{
http_client: ExAws.Request.HttpMock,
access_key_id: "AKIAIOSFODNN7EXAMPLE",
secret_access_key: "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
}
...
In the test code:
stub(ExAws.Request.HttpMock, :request, fn
_method, _url, _body, _headers, _opts ->
# whatever you want to return, example:
{:ok, %{status_code: 200, body: ""}}
end)
I hope it will help !






















