4

我们最近开始在黄瓜测试中使用VCR来存根请求。我们使用黄瓜表来描述不同类型的请求,并将它们作为变量存储在小黄瓜中。我们的磁带文件都经过重新设计以包含 erb,以便我们可以将值替换为我们想要测试的请求。

问题在于,每当有新请求时,VCR 都会记录新请求并覆盖(删除)磁带中的所有 erb,并用为该示例插入的请求替换它。每次我们运行值已更改的请求(例如,我们从正在与之交谈的 API 接收到的时间戳的值)时,都需要将所有 erb 复制回磁带文件中。这令人沮丧,因为测试一直在运行。

有谁知道为什么 VCR 在录制新响应时会去掉 erb?任何解决方法的想法?有没有办法在插值之前保存模板?

4

1 回答 1

4

自动将您对磁带的手动更改与新录制的磁带合并是一个难题,在我看来,最好留给专门设计用于处理文本文档历史并管理合并它们的工具(即您的源代码控制系统) . ERB 使它变得更加困难:虽然您可能只是使用 ERB 来插入变量,但可以使用任何有效的 ruby​​。ERB 中可能存在循环、条件等。VCR 无法自动合并这些内容。

几个建议:

  • 以更细化的方式使用磁带,以免它们经常被覆盖。我倾向于为每个 HTTP 请求或 HTTP 请求的逻辑组使用一个 casette。
  • 使用:once记录模式(最近的默认设置)防止现有磁带被覆盖。
  • 看看 VCR 的敏感数据过滤功能。这远不如 ERB 灵活(即您不能使用循环、条件或任何任意的 ruby​​ 代码),但对于简单的变量插值,它确实非常非常好。它不使用 ERB,而是使用占位符字符串——例如,您可以使用类似字符串<PASSWORD>来代替密码。VCR 在录制磁带时会自动插入占位符文本,并在播放时将其替换为正确的实际值。
  • 如果这不能满足您的需求,那么before_record 和 before_playback 钩子应该为您提供在录制磁带时进行自动插值(甚至是 ERB 片段插入)所需的所有功能。这基本上就是过滤的工作原理——请参见此处

如果这些东西不能满足您的需求,我当然愿意接受有关如何改进 VCR 的想法。

于 2011-06-23T06:26:29.447 回答