如何阻止录像机覆盖磁带中的erb

时间:2011-06-17 22:59:05

标签: ruby-on-rails ruby cucumber erb vcr

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

问题在于,每当有新请求时,VCR都会记录新请求,并且还会从磁带中覆盖(删除)所有erb,将其替换为针对该示例插入的请求。每当我们运行值已更改的请求(例如,我们从我们正在讨论的API接收的时间戳的值)时,所有erb都需要被复制回盒式磁带文件。这很令人沮丧,因为测试一直在运行。

有人知道为什么VCR会在录制新的回复时剥掉erb吗?任何解决方法的想法?有没有办法在插入模板之前保存模板?

1 个答案:

答案 0 :(得分:4)

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

一些建议:

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

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