2017-05-20 22 views
0

我需要整合的服務器返回編碼爲JWT的答案。更糟的是,響應體實際上是一個JSON,形式爲:驗證協議之前的編碼/加密機構

{d: token} with token = JWT.encode({id: 123, field: "John", etc.})

我想使用一個協議驗證的解碼令牌的內容。我知道我可以很容易地通過一個協議來驗證我返回了一個{d:string},我無法對字符串進行精確匹配(因爲JWT包含一些不同的ID)。我想要的是以下內容,它假設增加了一個新的Pact.JWT功能。

my_provider. upon_receiving('my request') .with(method: :post, path: '/order', headers: {'Content-Type' => 'application/json'} ).will_respond_with( status: 200, headers: {'Content-Type' => 'application/json; charset=utf-8'}, body: { d: Pact::JWT({ id: Pact.like(123), field: Pact.term(generate: "John", matcher: /J.*/ },signing_key,algo ) })

短加入這個條約::智威湯遜的,是有辦法實現這一目標樣的結果?

我已經在使用該協議代理來運行我的驗證。我知道你可以在發送驗證之前修改請求(How do I verify pacts against an API that requires an auth token?)。您可以在從代理服務器收到請求後修改請求嗎?

如果是這樣的話,我可以計劃以下解決方法:

  • 在我實際的代碼,有時期望在JWT
  • 解碼,而不是答案,一旦與運行我的測試開關(正常代碼行爲,嘲笑返回JWT數據編碼。
  • 運行我的測試第二次與開關關閉(代碼期望數據已經解碼,
  • 掛鉤到代理中:驗證任務以即時解碼JWT,並使用現有的契約機制進行驗證。 (我不知道該怎麼做的步驟)。

我的代碼是紅寶石。我無法訪問提供者。

任何建議表示讚賞!謝謝

回答

1

您可以使用(另一個)代理應用程序修改請求或響應。

class ProxyApp 

    def initialize real_provider_app 
    @real_provider_app = real_provider_app 
    end 

    def call env 
    response = @real_provider_app.call(env) 
    # modify response here 
    response 
    end 
end 

Pact.service_provider "My Service Provider" do 
    app { ProxyApp.new(RealApp) } 
end 
+1

的Pact.service_provider進入者代碼(如果有的話),並且需要一個要求,該應用在配置/申請中,當您有模塊MyAppName類申請所定義的「協議/提供商」 對於軌, 你會想要我的應用程序::應用程序 這回答它,雖然我沒有使用它,相反,我已經派pact-support來添加對Pact.Jwt對象的支持。 –