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

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

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

最佳答案

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

几个建议:

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

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

    关于ruby-on-rails - 如何阻止 VCR 覆盖磁带中的 erb,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6392633/

    10-13 04:44