【发布时间】:2021-12-25 21:45:46
【问题描述】:
我正在尝试为文件读取功能编写测试。该函数接受目录路径并开始扫描以对具有子目录的文件进行分类。
func FileScan(dir string) (map[string][]string, error) {
var dataset = make(map[string][]string)
files, err := ioutil.ReadDir(dir)
if err != nil {
return nil, err
}
for _, file := range files {
if file.IsDir() {
dirFiles, err := ioutil.ReadDir(fmt.Sprintf("%s/%s", dir, file.Name()))
if err != nil {
return nil, err
}
for _, dirFile := range dirFiles {
if !dirFile.IsDir() {
dataset[file.Name()] = append(dataset[file.Name()], dirFile.Name())
}
}
}
}
return dataset, nil
}
为了测试,我在测试文件旁边创建了一个临时目录,并在其中放置了一些子目录和文件,然后开始测试函数并通过 defer 调用清理函数以在测试后删除目录。
这是一个好习惯吗? ???
或者最好传递[]fs.FileInfo 的数组而不是目录路径,这样我就可以在测试中实现一个模拟的FileInfo。
【问题讨论】:
-
是的。这是一个很好的做法。您甚至可以签入测试目录和文件。无需创建和清理它们。
-
使用
os.MkdirTemp和/或os.CreateTemp在测试中创建目录和/或文件是很常见的。旁注 - 您应该使用ospkg 而不是ioutil。见golang.org/doc/go1.16#ioutil -
您可以在
testdata下创建一些测试文件/目录并将其作为源代码树的一部分。 -
我认为,一旦您可以避免使用文件系统,这是一种不好的做法。不接触文件系统时测试会更快。测试在无状态时不易出错。
标签: unit-testing go testing