Testing the Actual Interaction with Services
Learn different approaches of how to test the application code that talks to the actual API.
When working with third-party APIs like the weather API, we push the code that integrates with the API outside our application in a lightweight wrapper. When we’re testing our application, we’re able to swap out that small part with a double to run the rest of our application. However, we also need to make sure that the code that interacts with the API works. We’ll need a test for that.
In our weather API application, the code that interacts with the weather API is this:
defmodule SoggyWaffle.WeatherAPI do@behaviour SoggyWaffle.WeatherAPI.Behaviour@spec get_forecast(String.t()) ::{:ok, map()} | {:error, reason :: term()}def get_forecast(city) when is_binary(city) doapp_id = SoggyWaffle.api_key()query_params = URI.encode_query(%{"q" => city, "APPID" => app_id})url ="https://api.openweathermap.org/data/2.5/forecast?" <> query_paramscase HTTPoison.get(url) do{:ok, %HTTPoison.Response{status_code: 200} = response} ->{:ok, Jason.decode!(response.body)}{:ok, %HTTPoison.Response{status_code: status_code}} ->{:error, {:status, status_code}}{:error, reason} ->{:error, reason}endendend
We’re using HTTPoison as our HTTP client. The get/1
function lets us send a GET HTTP request to the URL we pass to it and returns an [:ok,
...