私はElixir/Phoenixサードパーティ製のモジュールを使って遊んできました。 (サードパーティのサービスからのいくつかのデータをフェッチするために使用されているモジュール)、これらのモジュールの一つは、そうのように見える:実際のデータは私の質問には関係ありませんElixir/Phoenixサービスモジュールのテスト
module TwitterService do
@twitter_url "https://api.twitter.com/1.1"
def fetch_tweets(user) do
# The actual code to fetch tweets
HTTPoison.get(@twitter_url)
|> process_response
end
def process_response({:ok, resp}) do
{:ok, Poison.decode! resp}
end
def process_response(_fail), do: {:ok, []}
end
。ここでは、テストでいくつかのテストを失敗させるために、@twitter_url
モジュール変数を動的に設定する方法に興味があります。例:
module TwitterServiceTest
test "Module returns {:ok, []} when Twitter API isn't available"
# I'd like this to be possible (coming from the world of Rails)
TwitterService.configure(:twitter_url, "new_value") # This line isn't possible
# Now the TwiterService shouldn't get anything from the url
tweets = TwitterService.fetch_tweets("test")
assert {:ok, []} = tweets
end
end
これを行うにはどうすればよいですか? 注::configs
を@twiter_url
に別々に設定するには、dev
とtest
の環境で個別に設定することができますが、Twitter APIの実際の応答についてもテストできますテスト環境。
私が思いついた解決策の1つは
def fetch_tweets(user, opts \\ []) do
_fetch_tweets(user, opts[:fail_on_test] || false)
end
defp _fetch_tweets(user, [fail_on_test: true]) do
# Fails
end
defp _fetch_tweets(user, [fail_on_test: false]) do
# Normal fetching
end
だったしかし、それはちょうどこれによりよい解決策がなければならない、ハックと愚かなようです。
これはjavascript-yの処理方法のようです。私はこれの背後にあるアイデアが気に入っていますが、唯一の懸念は、これを使って非同期ではないテストを行うことです。 これは、誰かがasyncを忘れたときにバグを引き起こす可能性があります:テストでtrue(複数の開発者がプロジェクトで作業している場合) –
'async'はデフォルトではfalseであるため、明示的に破棄する必要があります。しかし、あなたのユースケース(あまりにも多くのエンドポイントではありません)には実用的な場合は、ええ、私は@ mudasobwaのソリューションと一緒に行きます。 – Dogbert
これは、モジュール実装のコードを変更したくない場合に有効です。ここで、これを適用します。 –