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 ) })

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

我已经在使用协议代理来运行我的验证。我知道您可以在发送请求进行验证之前修改请求(如何针对需要身份验证令牌的 API 验证协议?)。从代理服务器收到请求后,您可以修改请求吗?

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

  • 我的实际代码中的一个开关,有时期望答案被解码而不是在 JWT 中
  • 在关闭开关的情况下运行我的测试一次(正常的代码行为,模拟返回 JWT 编码的数据。
  • 在关闭开关的情况下再次运行我的测试(代码期望数据已经解码,模拟返回解码数据。)
  • 使用第二次运行的合同 json
  • 挂钩到 proxy:verify 任务以即时解码 JWT,并使用现有的协议机制进行验证。(这一步我不知道怎么做)。

我的代码是红宝石。我无权访问提供商。

任何建议表示赞赏!谢谢

4

2 回答 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
于 2017-05-22T05:15:49.057 回答
0

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

在我看来,最好的是,

  • 不要仅为测试更改源代码
  • 确保您的测试仅验证编码的 json(在测试中生成编码的预期 json 并用实际验证)
于 2019-03-31T20:45:24.507 回答