如何在我的ExUnit测试中存根(或阻止运行)对工作者的调用?

The*_*Fox 6 elixir phoenix-framework

我有一个凤凰应用程序(它只是一个没有前端的宁静api),其中一个控制器做了一些我想测试的东西,但是在控制器的末尾它调用一个调度程序,它将一个有效负载发送给一个工人(在poolboy下运行)在后台处理收到的有效负载.

在我的控制器测试中,我实际上并不想测试工作者正在做的事情,我只是想知道已经使用正确的有效负载调用了worker的调度程序(例如,calledWith())

理想情况下,调度程序的功能是存根的,所以实际的东西永远不会运行.

我可以将一个额外的参数传递给调度程序,以确保它永远不会在worker上运行代码,但这似乎非常混乱,而存根似乎是个主意.

谢谢

编辑

调度程序代码:

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

  def parallel(data) do
    #pass off to poolboy
  end
end
Run Code Online (Sandbox Code Playgroud)

测试模拟:

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
Run Code Online (Sandbox Code Playgroud)

Pat*_*ity 7

有一个名为"mock"的模拟库,您可以使用它来临时模拟测试中的模块.例如:

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
Run Code Online (Sandbox Code Playgroud)