次のコードを (Elixir で) テストする方法を見つけようとしています。
defmacro __using__(_) do
quote do
# API functions will be used from this client
import Client.API
def list_storages do
case list_buckets do
{:ok, res} ->
case res.status_code do
200 ->
res.body
|> Friendly.find("name")
|> Enum.map(fn bucket -> bucket.text end)
_ ->
res |> show_error_message_and_code
end
{:error, reason} ->
parse_http_error reason
end
end
...
問題は、list_buckets
関数がClient.API
モジュールからインポートされていることです (別のプロジェクトで既にテストされているため、実際には何も変更できません)。私のアイデアは、API 関数をスタブ/モック/ダミーにして、ダミーの応答だけを返すようにすることでした。defoverridable
関数をオーバーライドするために使用しようとしましlist_buckets
たが、関数定義が別のモジュールで行われているため、機能しません。
José Valim による次の投稿を読み、Client.API モジュールのテストに役立ちましたが、これらの概念をこの特定の問題に適用する方法が見つかりません。
これまでの私の唯一の (そしてばかげた) アイデアは、テスト ファイル内のマクロ内のすべての関数を再実装し、そこで定義されたダミーの API 関数を使用することですが、テスト以外のコードにコードの変更がある場合、それは非常に間違っていると感じ、役に立ちません。
基本的に、考えられる 3 つのケースが正しいかどうかをテストしたいと思います。
- 受信
{:ok, res}
して暗号化200
→ 正しいデータを出力 - 受信
{:ok, res}
と別のコード -> エラーメッセージとコードを出力 - 受信
{:error, reason}
-> HTTP エラーを解析し、失敗の理由を出力します
誰でもこれで私を助けることができますか?