3 回答

TA貢獻1982條經驗 獲得超2個贊
您需要重構您的代碼并使其更適合測試。
這是我會怎么做:
func openAndReadFile(fileName string) [][]string {
file, err := os.Open(fileName)
if err != nil {
fmt.Printf("Failed to open file: %s", fileName)
}
lines, err := readFile(file)
if err != nil {
fmt.Printf("Failed to read file: %s", fileName)
}
return lines
}
func readFile(reader io.Reader) ([][]string, error) {
r := csv.NewReader(reader)
lines, err := r.ReadAll()
if err != nil {
log.Fatal(err)
}
return lines, err
}
然后為了測試,您可以簡單地使用實現該io.reader接口的任何數據結構。例如,我使用字節緩沖區,但您可以選擇網絡連接:
func TestReadFile(t *testing.T) {
var buffer bytes.Buffer
buffer.WriteString("fake, csv, data")
content, err := readFile(&buffer)
if err != nil {
t.Error("Failed to read csv data")
}
fmt.Print(content)
}

TA貢獻2041條經驗 獲得超4個贊
您顯示的功能主要由交互決定:與文件系統的交互以及與 csv 閱讀器的交互。為確保這些交互工作良好,您以后無論如何都必須針對文件系統和 csv 閱讀器進行一些集成測試。想想你希望找到哪些錯誤,你會發現錯誤更可能出現在交互層面:文件的順序是正確的,還是應該相反?nil 真的是表示沒有錯誤的值嗎?您是否必須為 Open 提供更多論據?ETC。
因此,我不會專注于對該功能進行單元測試。然而,這個函數是一個很好的候選者,可以模擬它使周圍代碼的單元測試更容易。因此,模擬openAndReadFile
對周圍代碼進行單元測試,并openAndReadFile
使用集成測試進行測試。

TA貢獻1966條經驗 獲得超4個贊
我強烈建議使用接口而不是文件名字符串,就像這里推薦的其他答案一樣,但如果你真的必須這樣做,唯一的方法可能是使用臨時文件。使用字符串文件名的決定已將代碼鎖定為假設文件系統上存在某些內容,并推入了文件管理的責任。
- 3 回答
- 0 關注
- 205 瀏覽
添加回答
舉報