gpt4 book ai didi

elixir - 如何在我的 ExUnit 测试中 stub (或阻止运行)对工作人员的调用?

转载 作者:行者123 更新时间:2023-12-04 14:43:11 25 4
gpt4 key购买 nike

我有一个 Phoenix 应用程序(它只是一个没有前端的 restful api),其中一个 Controller 做了一些我想测试的东西,但是在 Controller 的末尾它调用了一个调度程序,它将一个有效负载发送给一个工作人员(在 poolboy 下运行)在后台处理接收到的有效载荷。

在我的 Controller 测试中,我实际上并不想测试工作人员正在做的事情,我只想知道工作人员的调度程序是否已使用正确的有效负载(例如 calledWith() )

理想情况下,调度程序函数被 stub ,所以实际的事情永远不会运行。

我可以向调度程序传递一个额外的参数,以确保它永远不会在工作人员上运行代码,但这看起来很困惑,而 stub 似乎是个好主意。

谢谢

编辑

调度员代码:

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

关于elixir - 如何在我的 ExUnit 测试中 stub (或阻止运行)对工作人员的调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30838999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com