2016-06-11 6 views
3

Ich versuche, eines meiner Pakete zu 100% zu testen. Allerdings kann ich nicht finden, wie ich dies tun kann, ohne "gegen das System" (Funktionszeiger, etc.) zu sein.Golang - Testen mit Dateisystem und 100% erreichen

Ich habe versucht, etwas Ähnliches wie dies zu tun, aber ich kann 100%, weil der „echten“ Funktionen nicht erreichen:

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

(Von https://talks.golang.org/2012/10things.slide#8)

Hat einen Vorschlag jemand würde? :) Danke!

+3

Nicht auf 100% zielen. – Volker

+0

Ich könnte das tun, aber ich finde das merkwürdig, dass das System nicht gemacht wurde, um dieses Problem zu lösen ... – Lerenn

+3

Das Erreichen von 100% Leitungsabdeckung ist kein "Problem", das es zu lösen lohnt. – Volker

Antwort

0

Ich habe versucht, das gleiche zu tun, nur um es zu versuchen. Ich habe es erreicht, indem ich alle Systemdateiaufrufe als Schnittstellen referenzierte und die Methode eine Schnittstelle akzeptierte. Wenn keine Schnittstelle bereitgestellt wurde, wurde die Systemmethode verwendet. Ich bin brandneu bei Go, also bin ich mir nicht sicher, ob es Best Practices verletzt oder nicht.

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 
}