在 RSpec 自动化测试期间使 Sprockets 缓存无效

Invalidate Sprockets cache during RSpec automated test

在我的 Rails 应用程序中,我有一个 .js.erb 文件,其中包含一个根据某些 Ruby 代码动态设置的变量。

var myTimer = <%= MyApp.config.timeout_time * 1000 %>;

该应用程序运行良好,但我在某些自动化测试中遇到了问题。问题出现在与此 JavaScript 一起工作的 RSpec 功能测试中。我的规格文件有许多测试可以动态更改 ruby MyApp.config.timeout_time 时间以测试不同的场景。在我的规范文件中,第一个示例通过,其余示例失败。

我终于意识到这是在发生,因为 myTimer 永远不会在 JavaScript 端更新。当第一个测试运行时,JavaScript 会使用 Ruby 中设置的当前值进行编译。当我为第二次测试更改 Ruby 计时器时,RSpec 仍在使用 JavaScript.

中的先前值

有没有办法告诉 Sprockets/Rails 使文件或缓存的一部分无效,以便重建 JavaScript? 我不知道一般情况下我不想关闭缓存,我只需要一种在需要时根据每个测试使 application.js 无效的方法。

我也许可以 "touch" 文件系统上的 JavaScript 文件之一,让 sprockets 认为文件已被更改,但我真的不想那样做。

我不知道该怎么做。但是您可以考虑将 myTimer 设置为您希望它在需要它是特定值的功能规范中的值。

假设您使用的是 Capybara,您可以 运行 Javascript 在具有

的功能规范中
page.execute_script('// some Javascript')

您可能需要先重新安排一下 Javascript,以便将 myTimer 放在脚本可以更改的地方。