如何在我的 ExUnit 测试中存根(或阻止 运行)对工作人员的调用?
How to stub (or prevent running) of a call to a worker in my ExUnit test?
我有一个 Phoenix 应用程序(它只是一个没有前端的 restful api),其中一个控制器做了一些我想测试的东西,但在结束时控制器它调用一个调度程序,该调度程序将有效负载发送给工作人员(运行 在 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
有一个名为 "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
我有一个 Phoenix 应用程序(它只是一个没有前端的 restful api),其中一个控制器做了一些我想测试的东西,但在结束时控制器它调用一个调度程序,该调度程序将有效负载发送给工作人员(运行 在 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
有一个名为 "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