2016-01-20 58 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%注射,代碼看起來清晰簡潔,測試就像一個魅力!