首頁  >  文章  >  後端開發  >  Go 中的 Pact 消費者測試。 dsl.Match 函數的問題

Go 中的 Pact 消費者測試。 dsl.Match 函數的問題

WBOY
WBOY轉載
2024-02-11 18:15:08496瀏覽

Go 中的 Pact 消费者测试。 dsl.Match 函数的问题

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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除