如何用 Mox 模拟 HTTPoison?
How to mock HTTPoison with 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
这里的问题是我不能运行他们:
module HTTPoison is not a behaviour, please pass a behaviour to :for
模拟合同,而不是实施
现在,我知道 José Valim 支持这种意识形态,因此我们应该模拟的一切都应该有一个契约。但是 HTTPoison 不是我的,也没有。所以这让我想到以下问题:
- 我如何模拟不使用 Mox 提供行为的第 3 个库?
HTTPoison
uses the behaviour HTTPoison.Base
,所以在这个特殊情况下,你已经准备好了。
How can I mock 3rd libraries that don’t offer behaviours using Mox
?
通常,我们通过依赖注入来做到这一点。每当您需要第 3 方时,只需将其作为参数传递并在测试环境中传递另一个模块/模拟。
背景
我有一个库,它使用 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
这里的问题是我不能运行他们:
module HTTPoison is not a behaviour, please pass a behaviour to :for
模拟合同,而不是实施
现在,我知道 José Valim 支持这种意识形态,因此我们应该模拟的一切都应该有一个契约。但是 HTTPoison 不是我的,也没有。所以这让我想到以下问题:
- 我如何模拟不使用 Mox 提供行为的第 3 个库?
HTTPoison
uses the behaviour HTTPoison.Base
,所以在这个特殊情况下,你已经准备好了。
How can I mock 3rd libraries that don’t offer behaviours using
Mox
?
通常,我们通过依赖注入来做到这一点。每当您需要第 3 方时,只需将其作为参数传递并在测试环境中传递另一个模块/模拟。