7

私はPhoenixアプリ(フロントエンドのない単なる安らかなAPIです)を持っていて、コントローラーの1つがテストしたいことをしますが、コントローラーの最後で、ペイロードをワーカーに送信するディスパッチャーを呼び出します(poolboy の下で実行) を使用して、受信したペイロードをバックグラウンドで処理します。

私のコントローラー テストでは、ワーカーが行っていることを実際にテストしたくはありません。ワーカーのディスパッチャーが正しいペイロードで呼び出されたことを知りたいだけです (例、 calledWith() )。

そして理想的にはディスパッチャー関数はスタブ化されるため、実際のものが実行されることはありません。

ディスパッチャに追加のパラメータを渡して、ワーカ上でコードが実行されないようにすることもできますが、それは非常に厄介なように見えますが、スタブはアイデアのようです。

ありがとう

編集

ディスパッチャ コード:

defmodule Convert.Dispatcher do
  def dispatch(data) fo
   spawn (fn() -> parallel(data) end)
  end

  def parallel(data) do
    #pass off to poolboy
  end
end

テストのモック:

with_mock Convert.Dispatcher, [dispatch: fn(_opts) -> :ok end] do
  response = conn(:post, "/", data) |> send_request
  body = response.resp_body |> Poison.decode!
  assert response.status == 201
  assert called Convert.Dispatcher.dispatch("")
end
4

1 に答える 1

7

テストでモジュールを一時的にモックするために使用できる「モック」と呼ばれるモッキング ライブラリがあります。例えば:

defmodule MyControllerTest do
  use ExUnit.Case, async: false
  use RouterHelper
  import Mock

  setup do
    Logger.disable(self())
    :ok
  end

  test "dispatches a worker" do
    with_mock MyDispatcher, [dispatch: fn(_opts) -> :ok end] do
      call(Router, :get, "/my/route")
      assert called MyDispatcher.dispatch(foo: "bar")
    end
  end
end
于 2015-06-15T08:11:18.483 に答える