os.FileInfo mock不匹配

时间:2017-05-03 20:45:36

标签: unit-testing go interface mocking typing

在我的一个golang项目中,我去模拟os.FileInfo的测试用例。

我不确定我是否正确理解golang的接口处理。 据我所知,下面的代码应该可以工作,但是我得到一个Compilererror,说接口不匹配。

我修改了this go-doc示例,以防您想自己测试一下。

package main

import (
    "fmt"
    "io/ioutil"
    "log"
)

type file interface{
    Name() string
} 

func readFiles() []file{
    files, err := ioutil.ReadDir(".")

    if err != nil {
        log.Fatal(err)
    }

    return files
}

func main() {
    files := readFiles()

    for _, file := range files {
        fmt.Println(file.Name())
    }
}

在golang文档中,ioutil.ReadDir(".")应该返回os.FileInfo的片段,该片段应该是我自己编写的file界面的特化。

有人可以帮助我摆脱这种误解和纠缠吗?

非常感谢你们!

2 个答案:

答案 0 :(得分:0)

os.FileInfo是界面,可以转换为file。但您尝试将[]os.FileInfo转换为[]file。 Slice不是接口,也不能断言。

答案 1 :(得分:0)

要详细说明其他答案和评论,os.FileInfo确实满足您已定义的file接口,但是一部分os.FileInfo不会隐式转换为您的file的一部分接口。一个简单的解决方法是让您的readFiles明确进行转换,例如

func readFiles() []file{
    fileInfos, err := ioutil.ReadDir(".")

    if err != nil {
        log.Fatal(err)
    }

    files := make([]file, len(fileInfos))
    for i, fi := range fileInfos {
        files[i] = fi
    }

    return files
}