【问题标题】:RSpec crashing with multiple Rails validation helpersRSpec 因多个 Rails 验证助手而崩溃
【发布时间】:2013-04-17 18:06:15
【问题描述】:

我的 Customer 模型上的 :website 属性有两种不同的验证。一个是内置长度助手,最大值设置为 255,而另一个是自定义验证。它们都单独工作,并且适当的测试通过了,但是由于某种原因,当我使用两个验证运行测试时,RSpec 崩溃到我必须完成退出 Guard 并重新启动它。

这是我的代码,它们之间有什么冲突吗?我以前从未经历过:

class Customer < Active Record::Base

  ...

  URL_REGEX = /(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&amp;'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&amp;'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&amp;'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&amp;'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&amp;'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i

  validates :website, length: { maximum: 255 }
  validate :valid_urls

  private
    def valid_urls
      ["website", "blog", "contact"].each do |attribute|
        errors.add(attribute, "needs to be a valid url") if send(attribute).present? && URL_REGEX.match(send(attribute)).nil?
      end
    end
end

更新:感谢您的帮助,原来整个问题只是一个糟糕的正则表达式。我从 stackoverflow 线程中复制了正则表达式,该线程逃脱了一些 & 符号,产生了一个错误的正则表达式。我刚刚从 jQuery 验证源中复制了它,它工作正常,很抱歉。

【问题讨论】:

  • 需要更多信息。你使用的是什么 ruby​​/rails/rspec/guard 版本?您可以粘贴崩溃回溯(pastie.org 会很好)吗?关闭防护运行规范的结果是什么?
  • 嘿gmile。 ruby 1.9.2p290 // rails 3.2.11 // rspec 2.11.1 // 守卫 0.8.8。不幸的是,我没有得到回溯,它只是停止运行,直到我取消。我只是在关闭防护的情况下运行它,并且发生了完全相同的行为。一旦它通过我的测试,涉及建立一个指定网站的客户,它就会停止在它的轨道上。
  • mackshkatz,您可以尝试在没有保护的情况下运行测试,看看它是否有效?只需rspec spec/path/to/my_spec.rb
  • gmile,对不起,我就是这个意思。我用 rspec 运行它,所以看来 Guard 根本不参与这个问题。

标签: ruby-on-rails ruby rspec ruby-on-rails-3.2 guard


【解决方案1】:

Mackshkatz,您可以尝试删除自定义验证以使用 rails 提供的验证吗?因此:

class Customer < ActiveRecord::Base
  validates :website, format: { with: URL_REGEX }, allow_blank: true, length: { maximum: 255 }
  validates :blog,    format: { with: URL_REGEX }, allow_blank: true
  validates :contact, format: { with: URL_REGEX }, allow_blank: true
end

然后看看它是否通过了?看来问题可能出在您使用的复杂正则表达式中。

【讨论】:

  • 不幸的是,这也会产生完全相同的行为。不过感谢您的努力。
  • 你可以用一些超级愚蠢的正则表达式来代替它吗?我怀疑这可能是一个正则表达式问题。另外,能不能升级一下 ruby​​、rails 和 rspec 的版本?
  • 我对我的问题进行了更新,在自己发现问题时不确定协议是否正确,但正则表达式很糟糕。我从 SO 复制了它,其中的 & 符号已被转义,导致问题。所以我只是去图书馆的来源得到它。不过感谢您的帮助。
  • mackshkatz,您介意接受答案还是关闭问题?只是为了让其他人清楚这已经解决了
  • 是的,我会接受你的回答,因为它实际上确实清理了我的验证。当我意识到有一个不相关的解决方案时,是否有一个标准的行动要做,比如在我的情况下是一个糟糕的正则表达式?还是像我所做的那样更新我的问题就足够了?谢谢gmile。
猜你喜欢
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 2011-03-13
  • 2013-03-09
相关资源
最近更新 更多