Wie schreibt mock für Strukturen in Go
Ich möchte schreiben Sie einen unit-test für die Hire
- Funktion, die verlangen, dass die Verspottung CarFactory
und Car
Strukturen. Siehe den folgenden code:
package main
type Car struct {
Name string
}
func (h Car) Run() { ... }
type CarFactory struct {}
func (e CarFactory) MakeCar() Car {
return Car{}
}
func Transport(cf CarFactory) {
...
car := cf.MakeCar()
car.Run()
...
}
In anderen OOP-Sprachen wie Java, C# oder C++, ich kann nur definieren CarFactoryMock
und CarMock
erweitern CarFactory
und Car
dann überschreiben MakeCar()
- Methode zum zurückgeben einer CarMock
Objekt
class CarMock extends Car {
public Run() {...}
}
class CarFactoryMock extends CarFactory {
public Car MakeCar() { return new CarMock(); }
}
Transport(new CarFactoryMock())
Wie kann ich erreichen, das in Go?
Beachten Sie, dass ich ändern kann, Prototyp-und source-code von Transport
Funktion, aber halten muss CarFactory
und Car
die gleiche, da Sie aus einem 3. Paket
Den letzten code-snippet war über die Menschliche und Mitarbeiter, die zu Verwirrung führen`.
- Warum verspotten
Employee
? Warum verspottenHuman
? Nur bauen ein und Zeug ein echter Mitarbeiter inHire
und testen was passiert. Btw: Du code smells, wie Sie versucht, das zu tun, Vererbung basierten OOP in Gehen. Tun Sie das nicht, werden Sie sich verletzen. - Weil Mitarbeiter und Human nennen können 3rd-party-API, welche eine Internetverbindung. Ich will laufen meine unit-test offline.
- Gut, dann tun Sie das richtige und machen Sie Ihre Drittanbieter-API-Aufruf konfigurierbar und leiten diese Aufrufe von Fälschungen während der Prüfung. Nicht jeder OOP-best-practice-ist wirklich praktisch und am besten, vor allem im Gehen.
- Ich kann nicht touch der 3. Bibliothek und ich weiß nicht, wo ist der Endpunkt, was ist der urls, ..., die 3rd-party-also die BESTE Praxis hier ist ein fake, nicht für die Reale.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dachte ich es mir. Es braucht mehr code zu verspotten, eine Struktur, die im Gehen als andere OOP-Sprachen unterstützt full-späte Bindung.
Dieser code muss unverändert bleiben, da seine genommen von 3rd-party -
Da Gehen unterstützt nur die späte Bindung auf der Oberfläche, so habe ich zu machen
Transport
nehmen Sie ein interface als parameter anstelle von struct.Und hier ist die Parodie von
Kann ich jetzt einfach mit dem mock
Transport(CarFactoryMock{})
. Aber wenn ich versuche zu nennen, die echte Methode Verkehr(CarFactory{}), go-compiler zeigt mir FehlerAls die Nachricht sagen,
MakeCar
von der Schnittstelle gibt einICar
aber die eigentlicheMakeCar
gibt eineCar
. Gehen Sie nicht zulassen, dass. Gehen Sie um dieses problem, das ich habe, um zu definieren, einen wrapper, manuell konvertierenCar
zuICar
.Rufen Sie nun
Transport(CarFactoryWrapper{CarFactory{}})
Hier ist der funktionierende code https://play.golang.org/p/6YyeZP4tcC
Verwenden Sie eine Schnittstelle.
Hire
- Methode akzeptiert die SchnittstelleEmployee
, dann schreiben Sie eineMockEmployee
struct in Ihren tests.Human
in der mock-Instanz unterscheidet sich nicht von derHuman
in echte Instanz. Dann Während der Erstellung Ihres MockEmploye{} set fake-Daten inHuman
Instanz. wiemock := MockEmployee{h: Human{Name: "mock-human"}}