我一直無法找到從golang包模擬方法的解決方案。來自golang包的模擬方法
例如,我的項目的代碼嘗試在Os.Getwd()返回錯誤時進行恢復。我可以考慮對此進行單元測試的最簡單方法是模擬Os.Getwd()方法返回錯誤,並驗證代碼是否相應地工作。
我試過使用testify,但它似乎不可能。
任何人有任何經驗嗎?
我一直無法找到從golang包模擬方法的解決方案。來自golang包的模擬方法
例如,我的項目的代碼嘗試在Os.Getwd()返回錯誤時進行恢復。我可以考慮對此進行單元測試的最簡單方法是模擬Os.Getwd()方法返回錯誤,並驗證代碼是否相應地工作。
我試過使用testify,但它似乎不可能。
任何人有任何經驗嗎?
我自己的解決方案是將該方法作爲參數,在測試時允許注入「模擬」。另外,創建一個導出的方法作爲公共門面和一個未導出的方法進行測試。
例子:
func Foo() int {
return foo(os.Getpid)
}
func foo(getpid func() int) int {
return getpid()
}
看起來像服用看看os.Getwd test可以給你的你怎麼可以測試你的代碼的例子。尋找功能TestChdirAndGetwd
和TestProgWideChdir
。
從閱讀這些,似乎測試創建臨時文件夾。
所以一個實用的方法是創建臨時文件夾,就像上面提到的測試一樣,然後打破臨時文件夾,這樣os.Getwd
就會拋出一個錯誤讓你接受你的測試。
只要小心做這些操作,因爲它們可能會弄亂您的系統。我建議在一個輕量級容器或虛擬機中進行測試。
我知道這有點晚,但是,這裏是你如何做到的。
測試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
}
希望這回答了你的問題。
謝謝,這似乎是這樣做的一種方式,但希望在測試過程中創建一個模擬方法的簡單方法 –
嗯,由於其靜態類型的本質,與其他模式相比,語言(比如PHP),所以就模擬而言,我不知道另一種解決方案。不過,可能有一個我不知道的聰明伎倆。 – Elwinar
另一個解決方案是@sargas答案,一旦我開始廣泛使用文件,它就成爲我的一種做法:我創建了一個'test'目錄,其中包含一堆我知道會使我想要的方法失敗的狀態的文件。在處理文件系統時,我傾向於發現更簡單的... – Elwinar