L'éditeur PHP Apple partagera avec vous aujourd'hui une question sur les tests grand public Pact dans Go. Lorsque nous utilisons Pact pour des tests consommateurs, nous utilisons souvent la fonction dsl.Match pour faire correspondre des champs spécifiques dans les demandes et les réponses. Cependant, nous pouvons rencontrer certains problèmes, comme des champs qui ne correspondent pas correctement. Cet article approfondira cette problématique et proposera des solutions pour vous aider à mieux relever les défis des tests consommateurs Pact.
J'écris un test de consommation de pacte en utilisant go. Lorsque je définis l'interaction, je dois ajouter l'objet de réponse attendu. Le service du fournisseur est écrit en php et voici la réponse que j'attends :
return [ 'status' => 'success', 'data' => [ 'configuration' => associative array, 'undeploy_configuration' => associative array, 'meta_data' => associative array, 'undeploy_lora_app_key' => string, ], ];
Voici l'objet que j'ai créé en go pour représenter la réponse que je devrais obtenir :
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"), }), })
Cependant, lorsque j'exécute le test, j'obtiens cette erreur :
--- fail: testgetdeviceconfiguration (1.79s) panic: match: unhandled type: interface {} [recovered] panic: match: unhandled type: interface {}
Voici le code complet :
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) }
La méthode que vous utilisez (match
)采用带有结构标记注释的结构(请参阅https://github.com/pact-foundation/pact-go#auto-generate-matchers-from-struct-tags) 指定如何在结构应该匹配。您已经手动提供了具有正确匹配器的结构,因此根本不需要将其包装在 match
in.
Quelque chose comme ceci devrait fonctionner :
WillRespondWith(dsl.Response{ Status: 200, Headers: dsl.MapMatcher{"Content-Type": dsl.String("application/json")}, Body: deviceConfigurationResponse, })
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!