2014-09-02 77 views
0

我有一個調用操作系統並獲取實時數據的函數,以便每次調用時結果都會有所不同。使得調用的函數嵌套在五個函數調用之後,即在進行OS調用之前調用堆棧是五級深度。單元測試使用後臺進程深嵌在代碼結構中:Elixir

要測試頂層功能,需要重複的結果。想到測試的兩種方法...... 1.爲五個函數調用中的每一個添加一個額外的參數,並將「調出到操作系統」作爲函數。然後進行單元測試,將操作系統函數調用替換爲返回靜態文本的函數
2.使應用程序知道測試,並讓操作系統函數在測試環境中運行時返回靜態文本。 (我不知道該怎麼做)

我想知道;在代碼結構中嵌套深層的服務器進程的推薦Elixir測試方式是什麼?

回答

4

您可以使用mocks模擬到OS的電話:

舉個簡單的例子,如果你想測試一些代碼,調用HTTPotion.get得到一個網頁,但實際上不取,你可以做網頁像這樣的東西。

defmodule MyTest do 
    use ExUnit.Case, async: false 

    import Mock 

    test_with_mock "test_name", HTTPotion, 
    [get: fn(_url) -> "<html></html>" end] do 
    HTTPotion.get("http://example.com") 
    assert called HTTPotion.get("http://example.com") 
    end 
end 

with_mock創建一個模擬模塊。關鍵字列表爲我們想要在模擬中提供的函數提供了一套模擬實現(在這種情況下,僅爲get)。在with_mock裏面,我們運行測試代碼,我們可以檢查呼叫是否按照我們的預期使用called並提供了我們預期的呼叫示例(第二個參數:_具有匹配任何內容的特殊含義)。

+0

嘲笑可能是實現我的「選項2」的一種方式。以上。 – steve77 2014-09-08 04:38:27

+0

@ steve77 - 嘲笑的整個想法是,您可以測試應用程序_而不會意識到測試。 – 2014-09-08 06:20:10