问题标签 [pact-ruby]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1391 浏览

windows - 在 Babun 上使用 pact 安装后 Cygwin 软件包无法正常工作(Windows 10)

https://github.com/babun/babun/issues/702相同

我在安装时第一次注意到这一点pact install digwhich dig返回二进制文件的位置,但它什么也不做:

后来我意识到安装后没有任何软件包可以工作。我试过phprubygem)。

关于如何排除 Cygwin 故障的想法?我假设这就是问题所在。它安装在 %HOMEPATH%/.babun/cygwin


更新:当我从 Window 的 cmd.exe 尝试 ruby​​ 或 php 时,我收到一个标题为“未找到入口点”的错误对话框:过程入口点 __locale_ctype_ptr 无法位于动态链接库中... .babun\cygwin\bin \cygruby220.dll 或 cygphp.dll,分别。

我查了一下,但没有找到任何有用的信息。

我还应该补充一点,我刚刚意识到我最初可能已经在 Windows 7 上安装了 Babun(在升级到 10 之前),但是我现在在 Windows 10 上完全重新安装了一个,所以我希望这不是问题。

0 投票
2 回答
2606 浏览

ruby - 如何针对需要身份验证令牌的 API 验证协议?

我正在为我的合同测试套件使用Pact gem(并且喜欢它!)。我正在测试的 API 服务需要所有请求的授权令牌。

我知道如何为我的用户生成 API 令牌,但我不知道在 Pact 工作流程中放置令牌的位置。我在 Pact 文档和 repo 中搜索了示例,但没有任何运气。

我尝试在消费者规范中发送 POST 以生成令牌,但 Pact 模拟服务器不知道如何处理请求和错误(如我所料)。

我发现了这个例子requestFilter,它看起来很有希望,特别是能够使用 a和方法为所有请求分配预定义的标头addHeader

如何在 Pact gem 中使用这样的请求过滤器?

如果这不是当前功能,我还有什么替代方案?

更新:

J_A_X 的答案非常适合与模拟服务器创建协议,但它不能满足 API 服务提供商对有效身份验证令牌的期望。更具体地说,我需要在运行 pact:verify 时将有效的身份验证令牌动态插入到协议中。所以,更近了一步,但仍然需要弄清楚后半部分。

马修的回答包含对后半部分(pact:verify)的两种可能解决方案的提示。我犹豫是否要引入另一个依赖项,所以我很想让 ProxyApp 类示例正常工作。我不明白我到底会传递给 ProxyApp.new() 什么。建议?

0 投票
1 回答
465 浏览

ruby-on-rails - 在 Rails API 中针对测试环境运行 Pact

只是在我的 Rails API 上使用 Pact 并注意到开箱即用的 Pact 设置默认运行在“开发”环境中。

当我运行任务(RAILS_ENV=test)时,如何配置以针对“测试”环境运行而无需在命令行中指定它。无法在文档中轻松找到如何操作。

使用以下宝石:

pact_helper.rb:

谢谢,莫

0 投票
0 回答
284 浏览

pact - 如何使用 Pact 合同验证模拟 Rails 上的用户身份验证?

在 Pact 验证阶段,我需要模拟用户身份验证。最好的方法是什么?我正在使用带有设计的 Rails 4。

我找到了一个看起来很 hacky 的解决方案,它有效但看起来很丑,我希望有另一种方法可以做到这一点。我正在更换appPact 套件的内部,并根据需要手动设置用户warden。用户 ID 在提供者状态中设置。它看起来像这样:

我真的希望有一些完全不同的视角可以以更漂亮的方式完成这项任务。

0 投票
1 回答
169 浏览

ruby - 提取 PACT 中使用的确切值(当匹配通过正则表达式完成时,作为最初未知的值))

我有一个 ruby​​ pact 模拟服务提供商来捕获我的请求。我想提取请求中提供的确切值(由 Pact.term / Pact.like 匹配),以便在 pact 服务提供商回答请求后对该值进行进一步处理。

一个例子:密码重置功能。代码对邮件服务进行 API 调用,提供密码重置链接作为参数。Pact 捕获请求并成功模拟它,验证数据。我将 reset_link 作为参数之一(一个 Json 主体)传递。这在 Pact.term 中得到匹配。都好。但我也想恢复请求中使用的确切值(比如 reset_link: ' http://sample.com/reset-password?key=12345 '),所以我可以发出后续请求并检查那个确切的链接确实允许成功重置密码。

现在,如果我直接发送电子邮件,这很容易,我只需解析 Mail::TestMailer.deliveries.last

我怎样才能做到这一点?

我已经浏览了代码,即使创建 Pact::SomethingLike 子类也行不通,因为比较方法是一个可爱的函数式编程模块,而不是类中的方法。

是否有前/后钩子,或获取整个网络请求的方法?

PS:我知道这通常由我使用的底层库进行测试。库批准的调整功能的方法是覆盖某些方法,我需要重新测试整个功能。

PPS:这不是铁轨,而是罗达。

谢谢安德烈

0 投票
2 回答
210 浏览

pact - 验证协议之前的编码/加密正文

我需要集成的服务器返回其编码为 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,并使用现有的协议机制进行验证。(这一步我不知道怎么做)。

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

任何建议表示赞赏!谢谢

0 投票
1 回答
239 浏览

pact-ruby - 契约验证:失败/错误:expect(header_value).to match_header(name, expected_header_value)

使用协议验证消费者和提供者的响应标头是否匹配。在提供者端运行协议验证会给我以下错误:

但是,当我检查我的响应标头时,它给了我预期的值(“xyz”)。

这是我要验证的示例协议文件:

我是新来的契约。任何帮助,将不胜感激。

0 投票
1 回答
303 浏览

pact - Pact::JsonDiffer 与 pact-messages gem 的行为不符

我正在使用pact-messages gem 为事件消息队列提供程序的使用者生成一个 Pact 文件。

这是契约文件:

这是event_message提供者生成的(在 Ruby 中):

这是我将 Pact 与生成的消息进行比较的代码:

我希望has_kept_the_contract?return true,但合同失败,并且该print_difference方法从 Pact 输出以下内容:

似乎 Pact 正在将完整的"item": { "json_class": "..", "contents": ".." }哈希值与预期的 String 值进行比较,而不是与pact-support matchers source codeitem["contents"]中指示的预期 String 值进行比较,但我不知道为什么或如何修复它。

奇怪的是,我在不同的项目中进行了 pact-messages 合同测试,并且代码几乎相同。我一直在调试和源代码潜入各种 Pact 存储库,但没有运气。我难住了。建议?

pact宝石版1.22.2

pact-messages宝石版0.2.0

红宝石版本2.4