我有一个ping端点的ExUnit测试。该端点调用一个函数,该函数通过由客户端a la Jose Valim's famous post确定的http客户端进行外部调用。
在测试环境中,我正在使用HTTPoison的模拟模块。
defmodule HTTPoisonMock do
def get(_url), do: raise "You need to define this function for your test"
end
在测试本身中,我正在尝试重新定义此模块,以便该函数返回一个预设响应。
test "/my_endpoint" do
defmodule HTTPoisonMock do
def get(_url) do
{:ok, %HTTPoison.Response{body: []}}
end
end
conn = conn(:get, "/my_endpoint")
...
assert conn.status == 200
end
但是,未使用重新定义的模块。我在运行测试时得到了原始错误。
** (ArgumentError) You need to define this function for your test
我也尝试使用mock library执行此操作,即使我直接嘲笑HTTPoison,也会产生不同的错误。
require HTTPoison
test "/my_endpoint" do
with_mock HTTPoison, [:get, fn(_url) -> {:ok, %HTTPoison.Response{body: []}} end] do
conn = conn(:get, "/my_endpoint")
...
assert conn.status == 200
end
end
** (UndefinedFunctionError) function HTTPoison.start/0 is undefined (module HTTPoison is not available)
为什么我的重新定义的模块没有被使用?
答案 0 :(得分:3)
似乎问题已经解决,但我会回答未来访问者的原始问题。
要在测试中重新定义模块,可以:
WCF service
这在Elixir核心测试中大量使用,grep是test "/my_endpoint" do
Code.eval_string """
defmodule HTTPoisonMock do
def get(_url) do
{:ok, %HTTPoison.Response{body: []}}
end
end
"""
# do stuff
after
purge HTTPoisonMock
end
end
的回购。