2016-03-07 68 views
0

我一直無法找到從golang包模擬方法的解決方案。來自golang包的模擬方法

例如,我的項目的代碼嘗試在Os.Getwd()返回錯誤時進行恢復。我可以考慮對此進行單元測試的最簡單方法是模擬Os.Getwd()方法返回錯誤,並驗證代碼是否相應地工作。

我試過使用testify,但它似乎不可能。

任何人有任何經驗嗎?

回答

2

我自己的解決方案是將該方法作爲參數,在測試時允許注入「模擬」。另外,創建一個導出的方法作爲公共門面和一個未導出的方法進行測試。

例子:

func Foo() int {   
      return foo(os.Getpid) 
    }      

    func foo(getpid func() int) int { 
      return getpid()  
    } 
+0

謝謝,這似乎是這樣做的一種方式,但希望在測試過程中創建一個模擬方法的簡單方法 –

+0

嗯,由於其靜態類型的本質,與其他模式相比,語言(比如PHP),所以就模擬而言,我不知道另一種解決方案。不過,可能有一個我不知道的聰明伎倆。 – Elwinar

+0

另一個解決方案是@sargas答案,一旦我開始廣泛使用文件,它就成爲我的一種做法:我創建了一個'test'目錄,其中包含一堆我知道會使我想要的方法失敗的狀態的文件。在處理文件系統時,我傾向於發現更簡單的... – Elwinar

1

看起來像服用看看os.Getwd test可以給你的你怎麼可以測試你的代碼的例子。尋找功能TestChdirAndGetwdTestProgWideChdir

從閱讀這些,似乎測試創建臨時文件夾。

所以一個實用的方法是創建臨時文件夾,就像上面提到的測試一樣,然後打破臨時文件夾,這樣os.Getwd就會拋出一個錯誤讓你接受你的測試。

只要小心做這些操作,因爲它們可能會弄亂您的系統。我建議在一個輕量級容器或虛擬機中進行測試。

1

我知道這有點晚,但是,這裏是你如何做到的。

測試DAL或SystemCalls或包調用通常很困難。我解決這個問題的方法是將你的系統函數調用推到一個接口後面,然後模擬這些接口的功能。例如。

type SystemCalls interface { 
Getwd() error 
} 


type SystemCallsImplementation struct{ 
} 
func (SystemCallsImplementation) Getwd() error{ 
return Os.Getwd() 
} 

func MyFunc(sysCall SystemCalls) error{ 

sysCall.Getwd() 
} 

用這個,你注入你的接口,系統調用你的函數。現在,您可以輕鬆創建一個模擬實現界面進行測試。

type MockSystemCallsImplementation struct{ 
err error 
} 
func (MockSystemCallsImplementation) Getwd() error{ 
return err //this can be set to nil or some value in your test function 
} 

希望這回答了你的問題。