打开和读取文件的单元测试功能

jsm*_*1th 2 unit-testing go

我正在研究一个简单的程序,它正在执行一些文件读取,并且正在为我的程序添加单元测试。我在执行此操作时遇到了一个问题。我想对下面的函数进行单元测试,我的问题是该函数采用文件的名称,然后将其打开并处理。在测试期间,我实际上不想将其传递给真实文件。我想知道这是我可以以某种方式模拟的东西,以便我可以仅将其传递给“假”文件并由它来处理吗?谢谢!

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
}
Run Code Online (Sandbox Code Playgroud)

geo*_*eok 5

您需要重构代码并使之更适合测试。

这是我的方法:

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
}
Run Code Online (Sandbox Code Playgroud)

然后,为了进行测试,您可以简单地使用实现该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)
}
Run Code Online (Sandbox Code Playgroud)

  • 这很好地工作并且清理了 `openAndReadFile` 以及我认为需要发生的事情。 (2认同)