我有一個鳳凰應用程序(這只是一個沒有前端的安靜的api),其中一個控制器做了一些我想測試的東西,但是在控制器結束時它調用了一個調度器,一名工作人員(在poolboy下運行)在後臺處理收到的有效負載。在我的控制器測試中,我實際上並不想測試工作人員正在做的事情,我只想知道工作人員的調度程序已被調用了正確的有效負載(例如,稱爲With())如何在我的ExUnit測試中對工作人員進行調用(或阻止運行)?
理想情況下,調度程序的功能被扼殺,所以實際的東西永遠不會跑。
我可以傳遞一個額外的參數給調度員,以確保它永遠不會在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
測試模擬:
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
在考慮其他選項之前,請小心直接嘲笑圖書館。它可以防止同時運行該測試用例(由於全局修改模塊),緊密耦合您的實現,這意味着當您需要與另一個模塊交換並引入新的依賴關係時需要進行更多的工作。考慮注入你的依賴,而不是像http://blog.plataformatec.com.br/2015/10/mocks-and-explicit-contracts/和https://medium.com/@lasseebert/mocks-in-elixir- 7204f8cc9d0f – Dennis