如何使用Mox模拟HTTPoison?

时间:2019-01-15 09:04:44

标签: testing elixir httpoison mox

背景

我有使用HTTPoison进行某些功能测试的库。为了实现这一点,我使用Mox,我相信它是Elixir的通用模拟库(尽管还有其他一些库得到了JoséValim的认可)

问题

一切都很好,我在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不是一种行为,请将行为传递给:for

模拟合同,而不是实施

现在,我知道何塞·瓦利姆(JoséValim)支持这种意识形态,因此我们应该嘲笑的所有事物都应该有合同。但是HTTPoison不是我的,它没有一个。因此,这引出了以下问题:

  • 如何模拟不使用Mox的行为的第3个库?

1 个答案:

答案 0 :(得分:1)

HTTPoison uses the behaviour HTTPoison.Base,因此在这种情况下,您已经准备就绪。


  

如何模拟不使用Mox的行为的第3个库?

通常,我们通过依赖注入来实现。每当需要第三方时,只需将其作为参数传递,然后在测试环境中传递另一个模块/模拟即可。