Posted
技术标签:
【中文标题】Golang:创建用于测试文件读取功能的临时目录【英文标题】:Golang: Creating temporary directory for testing a file reading function 【发布时间】: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.FileInfoFileInfo
【问题讨论】:
是的。这是一个很好的做法。您甚至可以签入测试目录和文件。无需创建和清理它们。os.MkdirTempos.CreateTemposioutil
testdata
我认为,一旦您可以避免使用文件系统,这是一种不好的做法。不接触文件系统时测试会更快。测试在无状态时不易出错。
【参考方案1】:
os.ReadDirioutil.ReadDir
这是一个对您的代码进行了最少修改的工作示例 (playground link):
package main
import (
"fmt"
"io/fs"
"log"
"path"
"reflect"
"testing/fstest"
)
func main()
var myFiles fstest.MapFS = make(map[string]*fstest.MapFile)
myFiles["test_dir/i_am_a_file"] = &fstest.MapFile
myFiles["test_dir/i_am_a_directory/add_me_to_map"] = &fstest.MapFile
myFiles["test_dir/i_am_a_directory_too/add_me_to_map_too"] = &fstest.MapFile
myFiles["test_dir/i_am_a_directory_too/and_me"] = &fstest.MapFile
myFiles["test_dir/i_am_a_directory_too/do_not_add_me_to_map/"] = &fstest.MapFile
m, err := FileScan(myFiles, "test_dir")
if err != nil
log.Fatalln("Test failed:", err)
expectedMap := map[string][]string
"i_am_a_directory": "add_me_to_map",
"i_am_a_directory_too": "add_me_to_map_too", "and_me",
if !reflect.DeepEqual(expectedMap, m)
log.Fatalf("m: expected = %v, observed = %v", 2, expectedMap, m)
fmt.Println("OK")
func FileScan(fileSystem fs.FS, dir string) (map[string][]string, error)
var dataset = make(map[string][]string)
files, err := fs.ReadDir(fileSystem, dir)
if err != nil
return nil, err
for _, file := range files
if !file.IsDir()
continue
dirFiles, err := fs.ReadDir(fileSystem, path.Join(dir, file.Name()))
if err != nil
return nil, err
for _, dirFile := range dirFiles
if dirFile.IsDir()
continue
dataset[file.Name()] = append(dataset[file.Name()], dirFile.Name())
return dataset, nil
【讨论】:
以上是关于Golang:创建用于测试文件读取功能的临时目录的主要内容,如果未能解决你的问题,请参考以下文章