Rails资产管道测试通过生产环境失败

9
我在资产管道方面遇到了以下问题。
  • 我有一个包含图像的HTML电子邮件。
  • 我有测试覆盖成功发送电子邮件的情况。
  • 所有测试都通过了。
  • 当进入生产阶段时,需要发送电子邮件的功能出现了故障,因为HTML布局引用了不存在的图像。

这显然适用于所有预编译的资产。

对我来说,测试突然变得不再可靠。 有没有办法避免再次发生这种情况?


你已经配置好测试环境以使用预编译的资产了吗? - shigeya
你是指“config.assets.compile = false”吗?如果我这样做,每次运行测试时都需要预编译资产。这是一个可能的解决方案吗? - Fabrizio Regini
2个回答

13

我已经为自己的情况找到了完美的解决方案。如果你设置

 config.assets.compile = false 
 config.assets.digest = true

在测试环境中,您的测试将依赖于预编译的资源。

由于在快速开发和测试阶段每次预编译资产都很麻烦,所以在我的情况下仅在CI上拥有此配置就足够了。

您可以使用以下内容设置名为ci_config.rb的初始化程序:

if ENV['CI'] 
  class YourApp::Application
    config.assets.compile = false
    config.assets.digest = true 
  end
end

配置您的CI在启动时运行rake assets:precompile,结束时运行rake assets:clean。


1
这太棒了。谢谢。 - Pezholio

2
比较application.rb、production.rb和development.rb中的默认配置选项,并阅读Ruby on Rails指南中的配置Rails应用程序以了解选项。
重要的选项如下: config.serve_static_assets:将其设置为false(生产环境默认值),然后Rails将不会提供静态内容。 config.assets.compile:是否使用资产管道编译资产(如果需要)。
如果您将上述两个选项都设置为false(这是生产环境的默认设置),那么您需要:1)预编译并将静态内容放置在适当的位置,2)配置Web服务器(例如Apache或Nginx)以根据需要提供静态内容。
因此,对于生产环境,您不仅需要放置文件,还需要配置Web服务器以提供它们,或者您可以配置serve_static_assets以即时创建资产。您可能需要调整测试配置,但对于测试来说,默认情况下serve_static_assets为true,除非您更改它。

谢谢您的回答,但我正在寻找一个关注如何建立测试实践以避免再次发生描述情况的答案。 - Fabrizio Regini
@shigeya,问题在于测试环境和生产环境的配置在资产管道方面是不同的。想象一下,你已经将一个新的JavaScript文件添加到了你的资产中,但忘记将文件名包含在config.assets.precompile数组中。在这种情况下,测试会通过(使用config.assets.compile=true),但生产环境会失败(使用config.assets.compile=false)。所以问题不是关于如何使用资产管道,而是如何使生产环境和测试环境工作得一样。Fabrizio的答案是解决这个特定问题的一个可能的解决方法。 - Grimmo
感谢您的评论。我认为您对Fabrizio的情况猜测得很正确。对于我的情况,我已经配置了config.assets.precompile数组,所以可能是不同的原因。我现在无法再次重现这个问题,因此无法验证。 - shigeya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接