Как издеваться над HTTPoison с помощью Mox?

Фон

У меня есть библиотека, которая использует HTTPoison для некоторых функций, которые мне нужно протестировать. Для этого я использую Mox, который, как мне кажется, является универсальной библиотекой насмешек для Эликсира (даже хотя есть и другие, у этого есть одобрение Хосе Валима)

Проблема

Все идет хорошо, я определяю свои моки в test_helpers.exs:

    ExUnit.start()
    Mox.defmock(HTTPoisonMock, for: HTTPoison)

И я настроил свои фиктивные тесты:

defmodule Alfred.Test.Http.Test do
  use ExUnit.Case, async: true
  import Mox
  # Make sure mocks are verified when the test exits
  setup :verify_on_exit!

  describe "get" do
    test "works on OK" do
      HTTPoisonMock
      |> get(:get, fn _ -> 1 end)

      assert HTTPoisonMock.get(1) == 1
    end
  end
end

Проблема здесь в том, что я не могу их запустить:

модуль HTTPoison не является поведением, пожалуйста, передайте поведение: для

Мок-контракты, а не реализации

Я знаю, что Хосе Валим поддерживает эту идеологию, поэтому все, что мы должны высмеивать, должно иметь контракт. Но HTTPoison не мой, и у него его нет. Это подводит меня к следующему вопросу:

  • Как я могу издеваться над третьими библиотеками, которые не предлагают поведения с помощью Mox?

person Flame_Phoenix    schedule 15.01.2019    source источник


Ответы (1)


HTTPoison использует поведение _ 2_, так что в данном конкретном случае все готово.


Как с помощью Mox смоделировать 3-е библиотеки, не предлагающие варианты поведения?

Обычно мы делаем это с помощью внедрения зависимостей. Всякий раз, когда вам нужен сторонний сервер, вы просто передаете его в качестве параметра и передаете другой модуль / макет в тестовой среде.

person Aleksei Matiushkin    schedule 15.01.2019
comment
Я не могу использовать HTTPoison.Base, потому что хочу имитировать функции get, post, put ..., а не строгие, которые они разрешают. Я мог бы ввести модуль как фиктивный объект, но в чем тогда смысл Mox? - person Flame_Phoenix; 15.01.2019
comment
Сомневаюсь, что понимаю. Вы переходили по ссылкам, которые я предоставил? Что вы имеете в виду под «строгими, которые разрешают»? HTTPoison буквально псевдоним для HTTPoison.Base. Вот, например, get обратные вызовы. Кроме того, основная цель Mox - имитировать ваш собственный код. - person Aleksei Matiushkin; 15.01.2019
comment
Ах, я скучал по ним. Спасибо ! Я думал, вы упомянули функции, которые я могу расширить: https://github.com/edgurgel/httpoison#wrapping-httpoisonbase - person Flame_Phoenix; 15.01.2019
comment
@Flame_Phoenix, если вы разрабатываете открытый исходный код, не могли бы вы связать код, который вы используете? Очень в этом заинтересован :) - person Tangui; 15.01.2019
comment
@Tangui К сожалению, проект не openoruce: S - person Flame_Phoenix; 17.01.2019