2016-06-11 15 views
3

私は自分のパッケージをテストして100%に到達しようとしています。 しかし、私は "システムに対して"(関数のポインタなど)なくてもこれをどうやって行うことができるのか分かりません。Golang - ファイルシステムを使ってテストして100%に到達

私はこれに似た何かをしようとしたが、私は理由は「本物」の機能を100%に到達することはできません。

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

https://talks.golang.org/2012/10things.slide#8から)

を誰かが提案を持っているでしょうしていますか? :) ありがとう!

+3

100%を目標にしないでください。 – Volker

+0

私はそれをすることができましたが、システムがこの問題を解決するために作られていないということは奇妙です。 – Lerenn

+3

100%の回線カバレッジに到達することは、解決すべき "問題"ではありません。 – Volker

答えて

0

私は同じことをしようとしました。私は、すべてのシステムファイル呼び出しをインタフェースとして参照し、メソッドがインタフェースを受け入れるようにすることで実現しました。次に、インタフェースが提供されなかった場合は、システムメソッドが使用されました。私はGoの新しいブランドなので、ベストプラクティスに違反しているかどうかはわかりません。

import "io/ioutil" 


type ReadFile func (string) ([]byte, error) 


type FileLoader interface { 
    LoadPath(path string) []byte 
} 

// Initializes a LocalFileSystemLoader with default ioutil.ReadFile 
// as the method to read file. Optionally allows caller to provide 
// their own ReadFile for testing. 
func NewLocalFileSystemLoader(rffn ReadFile) *localFileSystemLoader{ 
    var rf ReadFile = ioutil.ReadFile 

    if rffn != nil { 
     rf = rffn 
    } 
    return &localFileSystemLoader{ 
     ReadFileFn: rf} 
} 

type localFileSystemLoader struct { 
    ReadFileFn ReadFile 
} 

func (lfsl *localFileSystemLoader) LoadPath(path string) []byte { 
    dat, err := lfsl.ReadFileFn(path) 
    if err != nil { 
     panic(err) 
    } 

    return dat 
} 
関連する問題