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 嵌套表单