2017-03-02 62 views
0

我在go函數中有簡單的工作流程,但是在進行單元測試時,我被困在將參數傳遞給內部函數或模擬內部函數返回結果。golang單元測試:內部函數參數

代碼:

package myFunc 

import (
    myPackage 
    bookPackage 
) 

func Init() (err error) { 
    err = getResource(myPackage.GetPath()) 
    ... 
} 

func getResource(path string) (err error) { 
    // get resource from path ... 
    err := bookPackage.GetBook(path) 
} 

測試:

package myFunc 

import "testing" 

func TestInit(t *testing.T) { 
    if err := Init(); err != nil { 
     t.Fatal("test failed") 
    } 
} 

結果:

--- FAIL: TestInit (0.00s) 
Failed to read path ... 

會有什麼一般soluti在這種情況下?例如,如果getResource()調用getBooks()並且它的參數來自另一個源?

如何模擬getBooks()返回結果,而不實際運行它?

感謝,

回答

0

我猜想這是不是真正的代碼,因爲你調用未導出的功能呢? myPackage.getPath()應該永遠不會工作。

不管怎麼說,我傾向於這樣做是出口什麼,我需要爲了改變測試方式:

package myPackage 

var Path string 

func init() { 
    Path = "/path/to/default/path" 
} 

func GetPath() { 
    return Path 
} 

,然後當你測試,你可以只覆蓋該變量,無論你需要它是:

package myFunc 

import (
    "testing" 
    "myPackage" 
) 

func TestInit(t *testing.T) { 
    myPackage.Path = "/test/path" 
    if err := Init(); err != nil { 
     t.Fatal("test failed") 
    } 
} 
+0

嗨戴夫,謝謝你的快速反應。我根據您的反饋修改了問題。 – user3670618

+0

內部函數getResource(myPackage.GetPath())通過調用另一個函數來獲取其參數,而不是從Init()傳入。我嘗試在測試中硬編碼路徑字符串,但它仍然無法得到它。 – user3670618