如何测试ioutil.ReadFile和os.Stat?

时间:2016-07-10 13:55:17

标签: unit-testing go

我有以下功能:

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(路径)创建不存在的路径,但是如何在没有" workarounds"的情况下测试这种类型的函数。并猜测函数是如何工作的?

问候。

2 个答案:

答案 0 :(得分:3)

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

我最好的解决方案是使用工厂来创建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")
    }

}

答案 1 :(得分:1)

您是否有任何特定原因要测试这些库函数?

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

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