Ruby on rails rake测试和ruby之间的神秘区别

Ruby on rails rake测试和ruby之间的神秘区别,ruby-on-rails,testing,scope,Ruby On Rails,Testing,Scope,这里是神秘的: 我有一个类似这样的范围(在Image.rb中) 请注意,委托是我在此之前定义的另一个范围 当我像这样离开它时,我可以运行我的测试,检查图像是否已“签出”,它是否不再可用。我没有把测试的代码放进去,因为它实际上并不重要 有了这段代码,当我运行“raketest”时,它会失败,但如果我运行“ruby test/unit/image_test.rb”,它就会工作!我在想我开始有一个糟糕的一天了。然后我试着 scope :moderate_all, lambda { dele

这里是神秘的:

我有一个类似这样的范围(在Image.rb中)

请注意,委托是我在此之前定义的另一个范围

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

有了这段代码,当我运行“raketest”时,它会失败,但如果我运行“ruby test/unit/image_test.rb”,它就会工作!我在想我开始有一个糟糕的一天了。然后我试着

  scope :moderate_all, lambda {
    delegates.where("moderation_flag = #{$moderation_flags[:not_moderated]}")
  }
和“耙测试”通过


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

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


我不知道为什么会失败,但如果您发布更多信息,我会尽力提供更多帮助。

$moderation\u标志看起来像一个全局标志,命名范围的值取决于它。我的猜测是,rake测试在全局准备就绪之前加载该类,但直接调用测试则相反


引入lambda会导致在使用作用域时计算where子句,因此当全局准备就绪时,它总是发生得很晚。

你说得太对了!我没有考虑全局变量加载顺序。我用0代替了我的全局变量,它在没有lambdata的情况下工作,但有一点奇怪,我没有得到任何错误,测试失败。不同之处在于返回的记录数不同。框架是否将常量设置为随机值?我想它可能会默认设置常量为0。但是0是适度标志的值[:not_moderated],所以有些东西对meThis来说仍然没有意义。这是正确的,更多信息请参见lain和我的评论
  scope :moderate_all, lambda {
    delegates.where("moderation_flag = #{$moderation_flags[:not_moderated]}")
  }