0
エンドポイントにpingを実行するExUnitテストがあります。そのエンドポイントは、環境によって決定されるhttpクライアント経由の外部呼び出しを行う関数を呼び出します。a la Jose Valim's famous post。エリクサー:テスト中のモジュールを再定義する
テスト環境では、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
私は私が直接HTTPoisonをからかっていた場合でも、別のエラーを発生させ、同様mock library、でこれを行うにしようとしました。
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)
再定義されたモジュールが使用されていないのはなぜですか?
私が知る限り、このようなモジュールを再定義することはできません。あなたは 'mock'で使用したコードを投稿できますか?これとまったく同じでない場合はエラーメッセージを表示できますか? – Dogbert
@Dogbert私は 'mock'バージョンでコードを更新しました。エラーは異なります。 – steel
':start/0'も嘲笑してみませんか? 'HTTPEison'、' get:fn(_url) - > {:ok、%HTTPoison.Response {body:[}}} end、start:fn() - > end)do'のようなものです。 – Dogbert