Heim >Backend-Entwicklung >Golang >Pakt-Verbrauchertests in Go. Problem mit der dsl.Match-Funktion
PHP-Editor Apple wird Ihnen heute eine Frage zum Pact-Verbrauchertest in Go stellen. Wenn wir Pact für Verbrauchertests verwenden, verwenden wir häufig die Funktion dsl.Match, um bestimmte Felder in Anfragen und Antworten abzugleichen. Es können jedoch einige Probleme auftreten, z. B. wenn Felder nicht richtig übereinstimmen. Dieser Artikel befasst sich mit diesem Problem und bietet Lösungen, die Ihnen helfen, die Herausforderungen von Pact-Verbrauchertests besser zu bewältigen.
Ich schreibe einen Pakt-Verbrauchertest mit go. Wenn ich die Interaktion definiere, muss ich das erwartete Antwortobjekt hinzufügen. Der Anbieterdienst ist in PHP geschrieben und dies ist die Antwort, die ich erwarte:
return [ 'status' => 'success', 'data' => [ 'configuration' => associative array, 'undeploy_configuration' => associative array, 'meta_data' => associative array, 'undeploy_lora_app_key' => string, ], ];
Dies ist das Objekt, das ich in go erstellt habe, um die Antwort darzustellen, die ich erhalten sollte:
deviceconfigurationresponse := dsl.like(map[string]interface{}{ "status": "success", "data": dsl.like(map[string]interface{}{ "configuration": dsl.mapmatcher{ "config1": dsl.string("value1"), "config2": dsl.string("value2"), }, "undeploy_configuration": dsl.mapmatcher{ "undeploy1": dsl.string("value3"), "undeploy2": dsl.string("value4"), }, "meta_data": dsl.mapmatcher{ "meta1": dsl.string("info1"), "meta2": dsl.string("info2"), }, "undeploy_lora_app_key": dsl.string("example_undeploy_lora_app_key"), }), })
Wenn ich jedoch den Test durchführe, erhalte ich diese Fehlermeldung:
--- fail: testgetdeviceconfiguration (1.79s) panic: match: unhandled type: interface {} [recovered] panic: match: unhandled type: interface {}
Dies ist der vollständige Code:
func TestGetDeviceConfiguration(t *testing.T) { // Create Pact client pact := &dsl.Pact{ Consumer: "consumer", Provider: "provider", PactDir: "./pacts", } defer pact.Teardown() deviceConfigurationResponse := dsl.Like(map[string]interface{}{ "status": "success", "data": dsl.Like(map[string]interface{}{ "configuration": dsl.MapMatcher{ "config1": dsl.String("value1"), "config2": dsl.String("value2"), }, "undeploy_configuration": dsl.MapMatcher{ "undeploy1": dsl.String("value3"), "undeploy2": dsl.String("value4"), }, "meta_data": dsl.MapMatcher{ "meta1": dsl.String("info1"), "meta2": dsl.String("info2"), }, "undeploy_lora_app_key": dsl.String("example_undeploy_lora_app_key"), }), }) // Define the expected interaction with the provisioning-service value := "123456789" pact. AddInteraction(). Given("Device configuration exists for the given device ID"). UponReceiving("A request to get device configuration"). WithRequest(dsl.Request{ Method: "GET", Path: dsl.String(fmt.Sprintf("/api/prov/state/%s/configuration", value)), Headers: dsl.MapMatcher{"Accept": dsl.String("application/json")}, }). WillRespondWith(dsl.Response{ Status: 200, Headers: dsl.MapMatcher{"Content-Type": dsl.String("application/json")}, Body: dsl.Match(deviceConfigurationResponse), }) // Test the OnSessionEstablished function var test = func() error { cache := new(CacheMock) deviceConfigGetter := new(DeviceConfigGetterMock) _, err := GetDeviceConfiguration(value) cache.AssertExpectations(t) deviceConfigGetter.AssertExpectations(t) return err } // Verify the interaction with the provider var err = pact.Verify(test) assert.NoError(t, err) }
Die Methode, die Sie verwenden (match
)采用带有结构标记注释的结构(请参阅https://github.com/pact-foundation/pact-go#auto-generate-matchers-from-struct-tags) 指定如何在结构应该匹配。您已经手动提供了具有正确匹配器的结构,因此根本不需要将其包装在 match
in.
So etwas sollte funktionieren:
WillRespondWith(dsl.Response{ Status: 200, Headers: dsl.MapMatcher{"Content-Type": dsl.String("application/json")}, Body: deviceConfigurationResponse, })
Das obige ist der detaillierte Inhalt vonPakt-Verbrauchertests in Go. Problem mit der dsl.Match-Funktion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!