当前位置: > > > > Go 中的 Pact 消费者测试。 dsl.Match 函数的问题
来源:stackoverflow
2024-04-27 17:36:36
0浏览
收藏
偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《Go 中的 Pact 消费者测试。 dsl.Match 函数的问题》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!
问题内容
我正在用 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
)采用带有结构标记注释的结构(请参阅) 指定如何在结构应该匹配。您已经手动提供了具有正确匹配器的结构,因此根本不需要将其包装在 match
中。
这样的事情应该有效:
WillRespondWith(dsl.Response{ Status: 200, Headers: dsl.MapMatcher{"Content-Type": dsl.String("application/json")}, Body: deviceConfigurationResponse, })
到这里,我们也就讲完了《Go 中的 Pact 消费者测试。 dsl.Match 函数的问题》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注公众号,带你了解更多关于的知识点!