2017-09-15 3 views
0

Ich verwende eine Drittanbieter-Bibliothek, die ein Wrapper über einige C-Funktionen ist. Leider sind fast alle Go-Funktionen frei (sie haben keinen Empfänger, sie sind keine Methoden); nicht der Design-Ansatz hätte ich genommen, aber es ist was ich habe.Golang testen mit Funktionen

Mit nur Gos Standard „Test“ Bibliothek:

Gibt es eine Lösung, die ich Tests erstellen kann, wo ich Funktionen verspotten?

Oder ist die Lösung, um die Bibliothek in Strukturen und Schnittstellen zu wickeln, dann die Schnittstelle zu verspotten, um mein Ziel zu erreichen?


Ich habe eine Monte-Carlo-Simulation erstellt, die auch die erzeugte Datenmenge verarbeiten. Einer meiner Auswertealgorithmen sucht nach bestimmten Modellen, die er dann zur Bewertung an die Drittanbieterfunktion übergibt. Ich kenne meine Randfälle und weiß, was der Anruf zählt, und das möchte ich testen.

Vielleicht ist nur ein einfacher Zähler erforderlich?

Andere Projekte, die diese Bibliothek verwenden, die ich gefunden habe, haben keine vollständige Abdeckung oder gar keine Tests.

+4

Was sind "freie" Funktionen? – JimB

+0

Funktionen ohne Go-Empfänger. Sie sind nicht an eine Struktur gebunden. – RomaH

+3

Also meinst du "Funktionen", da alles mit einem Empfänger als eine Methode betrachtet werden würde. Funktionen werden häufig in den meisten Fällen verwendet, und es gibt nichts, was diese davon abhält, getestet zu werden. Was genau willst du verspotten? Go nimmt normalerweise nicht den "Spott-alles" -Typ, den manche Sprachen benutzen, was oft dazu führt, dass die Mocks mehr als alles andere nützlich getestet werden. – JimB

Antwort

0

Sie können dies tun, indem Sie immer einen Verweis auf die aktuelle Funktion verwenden, wenn Sie sie aufrufen müssen.

Dann, wenn Sie die Funktion verspotten müssen, verweisen Sie nur den Verweis auf eine Scheinimplementierung.

Lassen Sie uns sagen, dies ist Ihre externe Funktion:

// this is the wrapper for an external function 
func externalFunction(i int) int { 
    return i * 10 // do something with input 
} 

du nie direkt anrufen, sondern einen Verweis auf sie erklären:

var processInt func(int) int = externalFunction 

Wenn Sie die Funktion, die Sie es tun aufrufen müssen mit die Referenz:

fmt.Println(processInt(5)) 

Dann ging Sie wollten Sie die Funktion verspotten, die Sie gerade ass ign ein Mock-Implementierung dieser Referenz:

processInt = mockFunction 

Dieser Spielplatz zusammen bringt und vielleicht klarer sein als die Erklärung:

https://play.golang.org/p/xBuriFHlm9

Wenn Sie eine Funktion haben, die eine func(int) int empfängt, können Sie Senden Sie diese Funktion entweder die tatsächliche externalFunction oder die , wenn Sie möchten, dass es die Mock-Implementierung verwendet.

Verwandte Themen