Golang单元测试中的Stubbing方法

时间:2016-01-20 05:50:20

标签: unit-testing go

我一直在想这整晚,但仍然找不到一种优雅的方式来做这件事。让我们说我有一个结构

type fileStruct {
    x int
}

func (f *fileStruct) filename() string {
    return fmt.Sprintf("%s/%d.log", exportPath, f.x)
}

func (f *fileStruct) write(data []byte) {
    ...
    file = os.File.Open(f.filename())
    ...
}

现在我想测试write方法和stub filename方法来返回临时文件名。我怎样才能做到这一点?到目前为止,我找到了两个选择:

  1. 声明filename = func(f * fileStruct)并在test
  2. 中覆盖它
  3. 使文件名成为结构的字段
  4. 但在这种情况下他们似乎都错了。所以问题是 - 我可以以任何方式存根这种方法吗?一般而言 - 如何对内部测试方法进行存根(对于外部明显的依赖注入可能有效)

2 个答案:

答案 0 :(得分:1)

使文件名成为结构的字段是一种优雅的方式。 新结构时应定义filename

type fileStruct {
    filename string
}

func newFileStruct(x int) *fileStruct {
    filename := fmt.Sprintf("%s/%d.log", exportPath, x)
    return &fileStruct{filename: filename}
}

func (f *fileStruct) write (data []byte) {
    ...
    file = os.File.Open(f.filename)
    ...
}

答案 1 :(得分:0)

结束使我的结构100%注射,代码看起来清晰简洁,测试就像一个魅力!