在验证契约之前编码/加密的正文

问题描述 投票:0回答:2

我需要集成的服务器返回其编码为JWT的答案。更糟糕的是,响应体实际上是一个json,形式如下:

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

我想对解码令牌的内容使用pact验证。我知道我可以很容易地得到一个协议,验证我得到了{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 ) })

没有添加这个Pact :: JWT,有没有办法实现这种结果?

我已经在使用pact代理来运行我的验证。我知道您可以在发送请求之前修改请求(How do I verify pacts against an API that requires an auth token?)。从代理服务器收到请求后,您可以修改请求吗?

如果是这种情况,我可以计划以下工作:

  • 在我的实际代码中切换有时期望解码而不是在JWT中解码
  • 关闭开关运行我的测试一次(正常的代码行为,模拟返回编码的JWT数据)。
  • 关闭开关第二次运行我的测试(代码期望数据已经解码,模拟返回解码数据。)
  • 使用第二次运行的合同json
  • 钩入代理:验证任务以动态解码JWT,并使用现有的pact机制进行验证。 (我不知道怎么办的步骤)。

我的代码是ruby。我无权访问提供商。

任何建议赞赏!谢谢

pact pact-ruby
2个回答
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

0
投票

Pact作为一种工具,我不希望它能提供开箱即用的这种行为。

在我看来,最好的是,

  • 不要仅为测试更改源代码
  • 确保您的测试仅验证编码的json(在测试中生成编码的预期json并使用实际验证)
© www.soinside.com 2019 - 2024. All rights reserved.