2016-05-07 20 views
2

私は(エリクサーで)次のコードをテストするための方法を把握しようとしてきた:別のモジュールからインポートしたクライアントAPI関数を使用している関数をテストするにはどうすればよいですか?

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関数をスタブ/モック/ダミーにして、ダミーの返信だけを返すことでした。私はを使用してlist_buckets関数をオーバーライドしようとしましたが、関数定義が別のモジュールで起こっているために機能しません。

私は以下を読んでいます:ホセ・ヴァリムのpostこれはClient.APIモジュールのテストに役立ちましたが、私はこれらの概念をこの特定の問題に適用する方法を見つけることはできません。

私の唯一の(そして愚かな)アイデアは、テストファイル内のマクロ内のすべての関数を再実装し、そこに定義されたダミーのAPI関数を使用することですが、非常に間違っていると感じ、テストコード。 >出力したエラーメッセージとコード - - >正しいデータ {:ok, res}を受け

  • し、別のコードを出力し

    1. 200{:ok, res}とコードを受信:

      は基本的に私は、次の3つの例が正しいかどうかをテストしたいです{:error, reason}を受け

    2. は - > HTTPエラーを解析し、失敗の理由を出力

    誰もこれで私を助けることができますか?

  • 答えて

    0

    あなたはまだそのブログ記事の原則を使用できます。 Client.Apiをインポートする代わりに、最後の変数としてlist_storagesに渡します。

    def list_storages(api \\ Client.Api) do 
        case api.list_buckets do 
    

    このようにして、アプリケーションコードで何も変更する必要はなく、関数のテスト時にダミーモックを渡すことができます。

    関連する問題