如何用Mox模拟HTTPoison



Background

我有使用 HTTPoison 来实现我需要测试的某些功能的库。为了实现这一目标,我正在使用 Mox,我相信它是 Elixir 的通用模拟库(即使还有其他人,这个库得到了何塞·瓦利姆的批准印章)

问题

一切都很顺利,我在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

模拟合约,而不是实现

现在,我知道何塞·瓦利姆支持这种意识形态,因此我们应该嘲笑的一切都应该有合同。但是HTTPoison不是我的,它也没有。因此,这让我想到了以下问题:

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

>HTTPoison使用行为HTTPoison.Base,所以在这种特殊情况下,你已经准备好了。


如何模拟不提供使用Mox行为的第三库?

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

相关内容

  • 没有找到相关文章