我要在一种方法中声明一个复杂的条件:
今天是:
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
答案 0 :(得分:0)
这是一个快速且很脏的解决方案:
if deal.video_url.present? && !Rails.env.test? && deal.video_url_changed?
# do stuff
end
但是如上所述,我强烈建议您不要这样做。
重新设计代码/和/或测试。不要修改代码以使测试通过-这意味着您的测试现在正在测试错误的东西!