当前位置: 首页 > 面试题库 >

在Golang中测试文件系统的示例代码

莘翰采
2023-03-14
问题内容

我正在尝试为将与文件系统交互的功能编写单元测试,并且希望能够在测试过程中模拟文件系统。

给出下面的代码作为该问题的答案,您可以在其中创建一个在测试期间使用的文件系统接口,但是我对Go并不陌生,并且正在努力寻找如何使用它。

请问有人能够提供一个示例说明如何在测试中使用该接口吗?

var fs fileSystem = osFS{}

type fileSystem interface {
    Open(name string) (file, error)
    Stat(name string) (os.FileInfo, error)
}

type file interface {
    io.Closer
    io.Reader
    io.ReaderAt
    io.Seeker
    Stat() (os.FileInfo, error)
}

// osFS implements fileSystem using the local disk.
type osFS struct{}

func (osFS) Open(name string) (file, error)        { return os.Open(name) }
func (osFS) Stat(name string) (os.FileInfo, error) { return os.Stat(name) }

问题答案:

您一定不能忘记的一件重要事情:如果与文件系统交互的代码filesystem使用fs全局变量(或filesystem测试代码可以使用的其他一些值)通过上述文件系统接口()进行模拟,则只能模拟文件系统。更改,例如传递的fs参数)。

让我们看一个这样的示例函数:

func getSize(name string) (int64, error) {
    stat, err := fs.Stat(name)
    if err != nil {
        return 0, err
    }
    return stat.Size(), nil
}

这个简单的getSize()函数返回由文件名指定的文件的大小,如果filesystem.Stat()失败则返回错误(返回错误)。

现在让我们编写一些完全覆盖此getSize()功能的单元测试。

我们将需要什么

我们需要一个的模拟版本filesystem,经过模拟,以便它实际上不与文件系统交互,但是在调用方法时filesystemfilesystem.Stat()在我们的示例中)返回敏感数据。为了最简单地模拟filesystem(或任何接口),我们将嵌入filesystemmockedFS,因此我们将“继承”其所有方法,并且只需要模拟可测试代码实际使用的内容。请注意,调用其他方法会导致运行时出现恐慌,因为我们实际上不会nil对此嵌入式对象提供明智的,非价值的filesystem,但是出于测试的目的,它不是必需的。

由于filesystem返回的值os.FileInfo(除错误外)是接口(并且其实现未从os包中导出),因此我们还需要模拟os.FileInfo。这将是mockedFileInfo,我们将执行此操作与模拟非常相似filesystem:我们将嵌入接口类型os.FileInfo,因此实际上我们只需要实现FileInfo.Size(),因为这是可测试getSize()函数调用的唯一方法。

准备/设置模拟文件系统

一旦有了模拟的类型,就必须设置它们。由于getSize()使用全局fs变量与文件系统进行交互,因此我们需要mockedFS为该全局fs变量分配我们的值。在执行此操作之前,建议保存其旧值,并在完成测试:“清理”后正确恢复旧值。

由于我们完全希望进行测试getSize()(包括错误情况),因此我们mockedFS可以控制是否应返回错误,并在不需要任何错误的情况下告诉它要返回什么,这使我们具有了强大的能力。

在进行测试时,我们可以操纵的“状态” mockedFS以使其行为符合我们的需求。

和测试代码

事不宜迟,完整的测试代码:

type mockedFS struct {
    // Embed so we only need to "override" what is used by testable functions
    osFS

    reportErr  bool  // Tells if this mocked FS should return error in our tests
    reportSize int64 // Tells what size should Stat() report in our test
}

type mockedFileInfo struct {
    // Embed this so we only need to add methods used by testable functions
    os.FileInfo
    size int64
}

func (m mockedFileInfo) Size() int64 { return m.size }

func (m mockedFS) Stat(name string) (os.FileInfo, error) {
    if m.reportErr {
        return nil, os.ErrNotExist
    }
    return mockedFileInfo{size: m.reportSize}, nil
}

func TestGetSize(t *testing.T) {
    oldFs := fs
    // Create and "install" mocked fs:
    mfs := &mockedFS{}
    fs = mfs
    // Make sure fs is restored after this test:
    defer func() {
        fs = oldFs
    }()

    // Test when filesystem.Stat() reports error:
    mfs.reportErr = true
    if _, err := getSize("hello.go"); err == nil {
        t.Error("Expected error, but err is nil!")
    }

    // Test when no error and size is returned:
    mfs.reportErr = false
    mfs.reportSize = 123
    if size, err := getSize("hello.go"); err != nil {
        t.Errorf("Expected no error, got: %v", err)
    } else if size != 123 {
        t.Errorf("Expected size %d, got: %d", 123, size)
    }
}


 类似资料:
  • 本文向大家介绍linux shell之通过标识测试文件系统属性的方法示例,包括了linux shell之通过标识测试文件系统属性的方法示例的使用技巧和注意事项,需要的朋友参考一下 1 通过标识测试文件系统属性 [ -f $file_var ] :如果给定的变量包含正常的文件路径或文件名,则返回真。 [ -x $var ] :如果给定的变量包含的文件可执行,则返回真。 [ -d $var ] :如果

  • 文件系统接口的使用例程 模块   创建目录   创建目录     打开目录   打开和关闭目录     读取目录   读取目录     文件读写   打开文件及文件读写     文件重命名   文件重命名     文件状态   查看文件大小     目录位置操作   保存与设置读取目录位置   详细描述 文件系统接口的使用例程

  • 主要内容:测试级别的层次结构,系统测试的类型系统测试包括测试完全集成的软件系统。通常,计算机系统是通过软件集成制成的。换句话说,一组软件的计算机系统执行各种任务,但只有软件才能执行任务; 软件必须与兼容的硬件接口。系统测试是一系列不同类型的有目的的测试行使和审查针对需求的集成软件的计算机系统的全部工作。 软件测试分为四个级别:单元测试,集成测试,系统测试和验收测试,所有这些都用于测试目的。单元测试用于测试单个软件; 集成测试用于测试整个系统

  • 问题内容: 是否有标准方法(无需安装第三方库)在Python中进行跨平台文件系统模拟?如果我必须使用第三方库,那么哪个库是标准库? 问题答案: pyfakefs(主页)做您想要的–一个 伪造的 文件系统;它是第三方,尽管该第三方是Google。有关使用的讨论,请参见如何为被测模块替换文件访问引用。 对于 嘲笑 ,unittest.mock是用于Python 3.3+(标准库PEP 0417); 有

  • 本文向大家介绍bootstrap栅格系统示例代码分享,包括了bootstrap栅格系统示例代码分享的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了bootstrap栅格系统的具体代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍vue展示dicom文件医疗系统的实现代码,包括了vue展示dicom文件医疗系统的实现代码的使用技巧和注意事项,需要的朋友参考一下 环境:vue、webpack、constone 资料来源及文件:https://github.com/GleasonBian/CornerstoneVueWADO 需要下载的模块:cornerstone-core、dicom-parser 需要下载的j