Ruby / Rails 4.2 - 如果A && B,其中B条件取决于Rails环境

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ruby / Rails 4.2 - 如果A && B,其中B条件取决于Rails环境相关的知识,希望对你有一定的参考价值。

我有一个复杂的条件来断言我的一个方法:

今天它是:

if deal.video_url.present? && deal.video_url_changed? 
  # do stuff
  # about 15 lines of code
end

不幸的是,story_step.st_video_url_changed?在Rspec测试中给出了误报和否定(请参阅此处提到的问题:How can I test that no attribute on a model has been modified using rspec?

无论如何,我想做的是修改这个条件检查线成为

“如果我们正在使用rails开发或生产环境,请检查A(deal.video_url.present?)&& B(deal.video_url_changed?)但如果Rails环境是Test,则只检查A deal.video_url.present?

我当然可以写:

if Rails.env.development? || Rails.env.production?
  if deal.video_url.present? && deal.video_url_changed? 
    # do stuff
    # about 15 lines of code
  end   
else # test environment
  if deal.video_url.present? 
    # do stuff
    # about 15 lines of code
  end

但是,当条件通过时,我觉得重复两次完全相同的15行代码并不是DRY。

我可以通过创建一个新方法来分解

if Rails.env.development? || Rails.env.production?
  if deal.video_url.present? && deal.video_url_changed? 
    new_method_to_factorize
  end
else # test environment
  if deal.video_url.present? 
    new_method_to_factorize
  end
end

def new_method_to_factorize
  # do stuff
  # about 15 lines of code
end

但我想知道是否可以更干净地编写它而不创建新方法?

我试过但是使用下面的代码失败了

if deal.video_url.present? && (deal.video_url_changed? unless Rails.env.test?) 
  # do stuff
  # about 15 lines of code
end

编辑

经过多次评论后,我意识到我正试图放弃拐杖,而我应该处理这个漏洞的核心问题。这个bug被创建了,因为我找到了一种将交易与步骤相关联的hacky方法。为了解决原始问题,我创建了一个新的Stackoverflow问题:Rails 4.2 / Rspec / rspec-retry - association belong/has_many failing

答案

这是一个快速而又非常脏的解决方案:

if deal.video_url.present? && !Rails.env.test? && deal.video_url_changed?
  # do stuff
end

但如上所述,我强烈建议你不要这样做。

重新设计代码/和/或测试。不要让代码通过测试 - 这意味着你的测试现在正在测试错误的东西!

以上是关于Ruby / Rails 4.2 - 如果A && B,其中B条件取决于Rails环境的主要内容,如果未能解决你的问题,请参考以下文章

ruby on rails 在制作新应用程序时显示未知编码名称。在 Windows 7 上,导轨 4.2

在 Ruby on Rails 4.2 中使用 Cocoon gem 嵌套表单

Ruby on Rails入门篇

ruby on rails如何安装

Rails 4.2 ActionController:BadRequest自定义错误消息

ruby基础教程之rails性能优化