【问题标题】:How to mock HTTPoison with Mox?如何用 Mox 模拟 HTTPoison?
【发布时间】:2019-01-15 09:04:43
【问题描述】:

背景

我有一个库,它使用 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 模拟不提供行为的第三个库?

【问题讨论】:

    标签: testing elixir httpoison mox


    【解决方案1】:

    HTTPoisonuses the behaviourHTTPoison.Base,所以在这种特殊情况下,你已经准备好了。


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

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

    【讨论】:

    • 我不能使用HTTPoison.Base,因为我想模拟 get、post、put ... 函数,而不是它们允许的严格函数。我可以依赖注入模块作为一个虚拟对象,但是 Mox 的意义何在?
    • 我怀疑我跟不上。你有没有点击我提供的链接? “他们允许的严格”是什么意思? HTTPoison 实际上是HTTPoison.Base别名。这里是例如get callbacks。另外,Mox 的重点是模拟你自己的代码
    • 啊,我错过了那些。谢谢 !我以为你提到了我可以扩展的功能:github.com/edgurgel/httpoison#wrapping-httpoisonbase
    • @Flame_Phoenix 如果你正在开发开源,你能链接你使用的代码吗?对它很感兴趣:)
    • @Tangui 对不起,这个项目不是opensoruce :S
    猜你喜欢
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 2019-12-06
    • 2018-11-28
    相关资源
    最近更新 更多