Elixir:重新定义测试模块

时间:2017-02-10 17:10:00

标签: elixir ex-unit

我有一个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)

为什么我的重新定义的模块没有被使用?

1 个答案:

答案 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 的回购。