2

次のコードを (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 つのケースが正しいかどうかをテストしたいと思います。

  1. 受信{:ok, res}して暗号化200→ 正しいデータを出力
  2. 受信{:ok, res}と別のコード -> エラーメッセージとコードを出力
  3. 受信{:error, reason}-> HTTP エラーを解析し、失敗の理由を出力します

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

4

1 に答える 1

0

そのブログ投稿の原則を引き続き使用できます。インポートする代わりにClient.Api、最後の変数として に渡しますlist_storages

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

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

于 2016-05-12T06:31:31.197 に答える