Как использовать байпас с Finch в тестах Elixir?

#elixir #finch

#elixir #finch

Вопрос:

Мой проект использует Finch для выполнения параллельных HTTP-запросов.

Я пытался добавить обход в свои тесты, но HTTP-запросы не обнаруживаются. Когда я запускаю тест, я получаю эту ошибку:

No HTTP request arrived at Bypass

Вот мой тест:

 defmodule MyClientTest do
  use ExUnit.Case, async: true

  setup do
    bypass = Bypass.open()
    {:ok, bypass: bypass}
  end

  describe "list_apps" do
    test "should have an expected app", %{bypass: bypass} do
      {:ok, contents} = File.read("test/apps.json")

      Bypass.expect(
        bypass,
        fn conn ->
          Plug.Conn.resp(conn, 200, contents)
        end
      )

      list_apps = MyClient.list_apps()
      assert length(list_apps) == 57
    end
  end
end
 

Вот мой модуль MyClient:

 defmodule MyClient do
  alias Finch.Response

  def child_spec do
    {Finch,
     name: __MODULE__,
     pools: %{
       "https://myapp.com" => [size: 100]
     }}
  end

  def applications_response do
    :get
    |> Finch.build("https://myapp.com/v2/apps.json")
    |> Finch.request(__MODULE__)
  end

  def handle_applications_response({:ok, %Response{body: body}}) do
    body
    |> Jason.decode!()
    end
  end

  def list_apps do
    handle_applications_response(applications_response())
  end

end
 

Комментарии:

1. Я никогда не использовал байпас, но взглянул на документы… вы запустили приложение обхода в своем test/test_helper.exs ?

Ответ №1:

Байпас не принимает HTTP-соединение, независимо от того, какой URI вы нажмете. Он настраивает тестовый сервер на localhost на случайном порту. Вам нужно получить этот порт (bypass.port), создать URI локального хоста, используя его, и передать этот URI в ваш тест, который будет вызван.