3 回答

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊
您需要重構(gòu)您的代碼并使其更適合測(cè)試。
這是我會(huì)怎么做:
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
}
然后為了測(cè)試,您可以簡(jiǎn)單地使用實(shí)現(xiàn)該io.reader接口的任何數(shù)據(jù)結(jié)構(gòu)。例如,我使用字節(jié)緩沖區(qū),但您可以選擇網(wǎng)絡(luò)連接:
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貢獻(xiàn)2041條經(jīng)驗(yàn) 獲得超4個(gè)贊
您顯示的功能主要由交互決定:與文件系統(tǒng)的交互以及與 csv 閱讀器的交互。為確保這些交互工作良好,您以后無(wú)論如何都必須針對(duì)文件系統(tǒng)和 csv 閱讀器進(jìn)行一些集成測(cè)試。想想你希望找到哪些錯(cuò)誤,你會(huì)發(fā)現(xiàn)錯(cuò)誤更可能出現(xiàn)在交互層面:文件的順序是正確的,還是應(yīng)該相反?nil 真的是表示沒(méi)有錯(cuò)誤的值嗎?您是否必須為 Open 提供更多論據(jù)?ETC。
因此,我不會(huì)專(zhuān)注于對(duì)該功能進(jìn)行單元測(cè)試。然而,這個(gè)函數(shù)是一個(gè)很好的候選者,可以模擬它使周?chē)a的單元測(cè)試更容易。因此,模擬openAndReadFile
對(duì)周?chē)a進(jìn)行單元測(cè)試,并openAndReadFile
使用集成測(cè)試進(jìn)行測(cè)試。

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊
我強(qiáng)烈建議使用接口而不是文件名字符串,就像這里推薦的其他答案一樣,但如果你真的必須這樣做,唯一的方法可能是使用臨時(shí)文件。使用字符串文件名的決定已將代碼鎖定為假設(shè)文件系統(tǒng)上存在某些內(nèi)容,并推入了文件管理的責(zé)任。
- 3 回答
- 0 關(guān)注
- 217 瀏覽
添加回答
舉報(bào)