php小編蘋果今天要跟大家分享關於Go中的Pact消費者測試的問題。在使用Pact進行消費者測試時,我們經常使用dsl.Match函數來匹配請求和回應中的特定欄位。然而,我們可能會遇到一些問題,例如無法正確匹配欄位的問題。本文將深入探討這個問題,並提供解決方案,幫助大家更好地應對Pact消費者測試中的挑戰。
我正在用 go 寫 pact 消費者測試。當我定義互動時,我需要添加預期的回應對象。提供者服務是用 php 寫的,這是我期望的回應:
return [ 'status' => 'success', 'data' => [ 'configuration' => associative array, 'undeploy_configuration' => associative array, 'meta_data' => associative array, 'undeploy_lora_app_key' => string, ], ];
這是我在 go 中建立的對象,用來表示我應該得到的回應:
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"), }), })
但是,當我執行測試時,我收到此錯誤:
--- fail: testgetdeviceconfiguration (1.79s) panic: match: unhandled type: interface {} [recovered] panic: match: unhandled type: interface {}
這是完整的程式碼:
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) }
您正在使用的方法(match
)採用結構標記註解的結構(請參閱https://github.com /pact-foundation/pact-go#auto-generate-matchers-from-struct-tags) 指定如何在結構應該匹配。您已經手動提供了具有正確匹配器的結構,因此根本不需要將其包裝在 match
中。
這樣的事情應該有效:
WillRespondWith(dsl.Response{ Status: 200, Headers: dsl.MapMatcher{"Content-Type": dsl.String("application/json")}, Body: deviceConfigurationResponse, })
以上是Go 中的 Pact 消費者測試。 dsl.Match 函數的問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!