Golang:创建用于测试文件读取功能的临时目录

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:创建用于测试文件读取功能的临时目录的主要内容,如果未能解决你的问题,请参考以下文章