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

时间:2018-06-26 14:34:40

标签: ruby-on-rails ruby ruby-on-rails-4

我要在一种方法中声明一个复杂的条件:

今天是:

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?

无论如何,我想做的就是将此条件检查行修改为

  

”如果我们处于开发或生产环境中,请   检查A(deal.video_url.present?)&& B(deal.video_url_changed?)   如果Rails环境为“测试”,则仅检查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

但是,我觉得在条件通过后重复执行 exact 相同的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

编辑

经过多番评论,我意识到我在试图拐杖的同时应该处理该漏洞的核心。之所以创建此错误,是因为我发现了一种将“交易”和“步骤”相关联的黑客方式。为了解决原始问题,我创建了一个新的Stackoverflow问题:Rails 4.2 / Rspec / rspec-retry - association belong/has_many failing

1 个答案:

答案 0 :(得分:0)

这是一个快速且很脏的解决方案:

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

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

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