5

我有一些iPhone客户端测试运行对我的开发轨道服务器。如果我在Rails配置中启用类缓存,则整个套件的运行速度要快一个数量级。另一方面,当我没有真正运行测试时,这会降低开发速度。我可以在Rails 3中以编程方式更改config.cache_classes吗?

我想让测试套件在开始时打开一个动作来打开类缓存,并在结束时再次执行另一个动作以关闭类缓存。

这甚至可能吗?如果是这样,怎么样?

回答

0

我不认为做你的建议会奏效。

但我建议你可能在寻找错误的解决方案。

如果你想要从你的iphone测试中访问你的开发数据库,​​那么为什么不添加一个新的环境。

添加新文件的config /环境/ iphone_dev.rb

require File.dirname(__FILE__)+"/development.rb" 
config.cache_classes = true 

而在你的database.yml(或mongoid.yml或其他)

iphone_dev: 
    host: localhost 
    database: my_app_development 

没有理由数据库斜面相同

现在只需运行rails server -eiphone_dev -p3001

你应该有一个服务器,几乎相同于您的开发服务器, ,但运行在不同的端口,启用缓存。

+0

这并不是一个坏主意,有两台服务器并行运行,但它不能解决问题。每当我进行更改时,我仍然需要重新启动这个新的测试服务器。 – ilya

+0

我想你可能不得不决定'更快的请求与恼人的重启'或'更慢的请求自动加载更改' –

+0

是的,这是目前的情况。我只想在某段时间内打开“快速模式”。 – ilya

1

不是没有一些严重的黑客行为。 Rails会遇到很多麻烦,以确保您的文件在每次请求时都被重新加载(当cache_classes=false)时。所述cache_classes配置变量的值中的几个地方使用由初始化并非最不重要,其存在的:使用require加载红宝石文件时cache_classes是true(意味着它们不再重新加载的)

  • 设置

    • 调度回调reaload应用在每次请求时cache_classesfalse

    你确实有访问cache_classes变量的值,如果你喜欢,你甚至可以改变它:

    Rails.configuration.cache_classes = true 
    

    但是,这会对工作轨实例作为地方则使用该值仅在Rails应用程序启动时运行一次初始化没有影响。

    这意味着什么,除非你准备投入一些严肃的时间和黑客的努力,你真的不能避免重启服务器。所以,你需要看的是通过你的测试套件来控制这个重启过程。

    例如,您可以尝试重新启动rails from within rails。这将允许你定义一个动作,你的测试套件可以在开始执行之前点击它(以正确的模式重新启动服务器),以及在所有测试完成后服务器可以击中的另一个动作,以便通过设置cache_classes到以前的样子。您可以通过环境变量like this post suggests来控制缓存类的值。

    它仍然需要一些工作来设置所有这一切,并让它们挂在一起,但如果你想要一个“自动 - 神奇”的解决方案,这可能是你最好的选择。

  • 相关问题