2015-06-15 28 views
6

我有一個鳳凰應用程序(這只是一個沒有前端的安靜的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 
+1

在考慮其他選項之前,請小心直接嘲笑圖書館。它可以防止同時運行該測試用例(由於全局修改模塊),緊密耦合您的實現,這意味着當您需要與另一個模塊交換並引入新的依賴關係時需要進行更多的工作。考慮注入你的依賴,而不是像http://blog.plataformatec.com.br/2015/10/mocks-and-explicit-contracts/和https://medium.com/@lasseebert/mocks-in-elixir- 7204f8cc9d0f – Dennis

回答

7

有一個叫"mock"嘲弄庫,你可以用它來暫時模擬模塊在你身上r測試。例如:

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 
+0

謝謝,這看起來不錯,我會給它去一個 – TheStoneFox

+0

問題我得到的是模擬工作正常(即代碼不運行),但當我嘗試並做斷言時,我得到的錯誤「預期truthy ,得到錯誤「 - 但我知道代碼執行,因爲我看到它輸出之前添加模擬:/ – TheStoneFox

+0

你確定它被調用期望的參數? –

相關問題