耙子测试和红宝石之间的神秘区别

时间:2010-12-23 23:39:58

标签: ruby-on-rails testing scope

这是神秘的:

我有一个看起来像这样的范围(在Image.rb中)

  scope :moderate_all, delegates.where("moderation_flag = #{$moderation_flags[:not_moderated]}")

请注意,委托是我在moderate_all

之前定义的另一个范围

当我这样离开时,我可以运行我的测试,检查图像是否已“检出”,它不再可用。我没有把测试代码,因为它实际上并不重要。

使用此代码,当我运行“rake test”时它会失败,但如果我执行“ruby test / unit / image_test.rb”它就可以了!我以为我开始有一个糟糕的一天。然后我试了

  scope :moderate_all, lambda {
    delegates.where("moderation_flag = #{$moderation_flags[:not_moderated]}")
  }

“rake test”通过了!

所以我的问题解决了,但为什么呢?

2 个答案:

答案 0 :(得分:1)

$ moderation_flags看起来像一个全局的,命名范围的值取决于它。我的猜测是rake测试在全局准备好之前加载了类,但是直接调用测试则是另一种方式。

引入lambda会导致在使用范围时评估where子句,因此它总是在全局准备就绪时发生。

答案 1 :(得分:0)

如果您可以发布失败,那将有助于回答这个问题,但这就是我要说的,当您使用lambda来评估范围的条件时,它们会在运行时进行评估。因此,如果您的范围与使用Time.now类似,那么这很重要。

我不确定为什么会失败,但如果您发布更多信息,我会尝试提供更多帮助。