亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

打開和讀取文件的單元測試功能

打開和讀取文件的單元測試功能

Go
大話西游666 2023-06-19 17:48:31
我正在學習如何使用一個簡單的程序進行一些文件讀取,并正在為我的程序添加單元測試。這樣做時我遇到了一個問題/問題。我想對下面的函數進行單元測試,我的問題是該函數采用文件的名稱,然后打開并處理該文件。在測試期間,我不想實際將真實文件傳遞給它。我想知道這是我可以以某種方式模擬的東西,以便我可以將它傳遞給一個“假”文件并讓它處理它嗎?謝謝!func openAndReadFile(fileName string) [][]string {    file, err := os.Open(fileName)    if err != nil {        fmt.Printf("Failed to read file: %s", fileName)    }    r := csv.NewReader(file)    lines, err := r.ReadAll()    if err != nil {        log.Fatal(err)    }    return lines}
查看完整描述

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)

}


查看完整回答
反對 回復 2023-06-19
?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

您顯示的功能主要由交互決定:與文件系統的交互以及與 csv 閱讀器的交互。為確保這些交互工作良好,您以后無論如何都必須針對文件系統和 csv 閱讀器進行一些集成測試。想想你希望找到哪些錯誤,你會發現錯誤更可能出現在交互層面:文件的順序是正確的,還是應該相反?nil 真的是表示沒有錯誤的值嗎?您是否必須為 Open 提供更多論據?ETC。

因此,我不會專注于對該功能進行單元測試。然而,這個函數是一個很好的候選者,可以模擬它使周圍代碼的單元測試更容易。因此,模擬openAndReadFile對周圍代碼進行單元測試,并openAndReadFile使用集成測試進行測試。


查看完整回答
反對 回復 2023-06-19
?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

我強烈建議使用接口而不是文件名字符串,就像這里推薦的其他答案一樣,但如果你真的必須這樣做,唯一的方法可能是使用臨時文件。使用字符串文件名的決定已將代碼鎖定為假設文件系統上存在某些內容,并推入了文件管理的責任。



查看完整回答
反對 回復 2023-06-19
  • 3 回答
  • 0 關注
  • 205 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號