2017-02-10 7 views
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) 

再定義されたモジュールが使用されていないのはなぜですか?

+0

私が知る限り、このようなモジュールを再定義することはできません。あなたは 'mock'で使用したコードを投稿できますか?これとまったく同じでない場合はエラーメッセージを表示できますか? – Dogbert

+0

@Dogbert私は 'mock'バージョンでコードを更新しました。エラーは異なります。 – steel

+0

':start/0'も嘲笑してみませんか? 'HTTPEison'、' get:fn(_url) - > {:ok、%HTTPoison.Response {body:[}}} end、start:fn() - > end)do'のようなものです。 – Dogbert

答えて

2

問題は既に解決されているようですが、私は将来の訪問者のために元の質問に答えるでしょう。

、テストに1を、モジュールを再定義するかもしれません:

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 

はこれを重くpurgeのためにレポをgrepし、エリクサーコア試験で使用されています。