2016-01-20 43 views
1

我一直在想这整个晚上,但仍然找不到一个优雅的方式来做这件事。假设我有一个结构体Golang单元测试中的存根方法

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()) 
    ... 
} 

现在我想测试写入方法和存根文件名方法以返回临时文件名。我怎样才能做到这一点?到了此刻我发现了两个选项:

  1. 申报文件名= FUNC(F * fileStruct)和测试覆盖它
  2. 使文件名结构的场

但他们似乎都错这个案例。所以问题是 - 我可以以任何方式存根这种方法吗?一般来说 - 如何测试内部方法(对于外部明显的依赖注入可以起作用)

回答

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) 
    ... 
} 
0

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