【问题标题】:How to test the ioutil.ReadFile and os.Stat?如何测试 ioutil.ReadFile 和 os.Stat?
【发布时间】:2016-07-10 13:55:16
【问题描述】:

我有以下功能:

func GetDataFromFile(path string) ([]byte, error) {
    _, err := os.Stat(path)
    if err != nil {
        return nil, err
    }
    data, err := ioutil.ReadFile(path)
    if err != nil {
        return nil, err
    }
    return data, nil
}

我想在函数 ioutil.ReadFile 和 os.Stat(path) 抛出错误时对其进行测试。 我知道我可以为 os.Stat(path) 创建不存在的路径,但是如何在没有“变通办法”的情况下测试此类函数并猜测函数是如何工作的?

问候。

【问题讨论】:

标签: unit-testing go


【解决方案1】:

我同意 abhink 的观点,我不希望你测试这个特定的功能。但在实践中,类似的情况经常发生。

我最好的解决方案是使用工厂创建GetDataFromFile。在这种情况下,您需要注入依赖项。

main.go

package main

import (
    "io/ioutil"
    "os"
)

func getDataFromFileFactory(
    stat func(filename string) (os.FileInfo, error),
    readFile func(filename string) ([]byte, error),
) func(path string) ([]byte, error) {

    return func(path string) ([]byte, error) {
        _, err := stat(path)
        if err != nil {
            return nil, err
        }
        data, err := readFile(path)
        if err != nil {
            return nil, err
        }
        return data, nil
    }
}

var GetDataFromFile = getDataFromFileFactory(os.Stat, ioutil.ReadFile)

func main() {}

main_test.go

package main

import (
    "errors"
    "os"
    "testing"
)

func TestGetDataFromFile(t *testing.T) {
    stat := func(filename string) (os.FileInfo, error) {
        return nil, errors.New("err msg")
    }

    readfile := func(filename string) ([]byte, error) {
        t.Error("should not call this function")
        return nil, nil
    }

    getDataFromFile := getDataFromFileFactory(stat, readfile)

    if _, err := getDataFromFile("foo"); err.Error() != "err msg" {
        t.Error("expected an error to be thrown")
    }

}

【讨论】:

    【解决方案2】:

    您有什么具体原因要测试这些库函数吗?

    您应该只关心测试您自己的代码和逻辑。库由创建和维护它们的人测试,您应该完全使用它们,并期望按照它们的文档执行。任何与预期行为的真正偏差都应报告给图书馆的作者/维护者。

    至于测试GetDataFromFile,通过提供不正确的路径来测试它是完全合法的。对于更具体的错误,您还可以阅读可能导致错误的输入参数并使用这些参数调用函数。

    【讨论】:

    • 我只想测试GetDataFromFile 所以我想在if err != nil { 时有一个测试用例
    猜你喜欢
    • 2020-07-15
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    相关资源
    最近更新 更多