登录
首页 >  Golang >  Go问答

单元测试函数用于打开和读取文件

来源:stackoverflow

时间:2024-03-11 19:42:27 368浏览 收藏

对于一个Golang开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《单元测试函数用于打开和读取文件》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

问题内容

我正在学习使用一个简单的程序来学习 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
}

解决方案


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

这是我的做法:

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)
}

您所展示的功能以交互为主:与文件系统的交互以及与 csv 阅读器的交互。为了确保这些交互工作良好,您稍后必须对文件系统和 csv 读取器进行一些集成测试。想想您希望找到哪些错误,您会发现错误更有可能出现在交互级别: file,err 的顺序是否正确,还是应该相反? nil 真的是表示没有错误的值吗?还需要给open更多的论据吗?等等

因此,我不会集中精力对该功能进行单元测试。然而,这个函数是一个很好的候选函数,可以被模拟,以便更容易地对周围的代码进行单元测试。因此,模拟 openandreadfile 对周围的代码进行单元测试,并使用集成测试来测试 openandreadfile

今天关于《单元测试函数用于打开和读取文件》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>