我有以下功能:
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"的情况下测试这种类型的函数。并猜测函数是如何工作的?
问候。
答案 0 :(得分:3)
我同意这里的观点,我不指望你测试这个特定的功能。但在实践中,类似的情况经常发生。
我最好的解决方案是使用工厂来创建GetDataFromFile
。在这种情况下,您将注入依赖项。
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() {}
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
,通过提供错误的路径来测试它是完全合法的。对于更具体的错误,您还可以读取导致它们的输入参数,并使用这些参数调用函数。