【问题标题】:Best practice: Ruby/Rails Rspec regex testing最佳实践:Ruby/Rails Rspec 正则表达式测试
【发布时间】:2010-09-20 16:50:36
【问题描述】:

您能告诉我如何正确测试正则表达式代码吗?

我使用以下代码测试我的用户登录属性:

# user.rb
class User < ActiveRecord::Base
  #...
  validates_format_of :login, :with => /^[a-zA-z0-9_.]{3,18}$/
end

# user_spec.rb
describe User do
  before(:each) do 
    @user = Factory.build(:user)
    @user.save
  end

  subject { @user }
  it { should be_valid }

  it { should_not allow_value("b lah").for(:login) }
  it { should_not allow_value("bälah").for(:login) }
  it { should_not allow_value("b@lah").for(:login) }
  it { should_not allow_value("bülah").for(:login) }
  it { should_not allow_value("bßlah").for(:login) }
  it { should_not allow_value("b!lah").for(:login) }
  it { should_not allow_value("b%lah").for(:login) }
  it { should_not allow_value("b)lah").for(:login) }
  # ....
  # Shall I test here every special sign????
end

但它似乎非常多余且不安全....有最佳实践吗?谢谢!

【问题讨论】:

  • 只是好奇,在用户登录中使用这些字符有什么问题?似乎ü 之类的东西应该是有效的。
  • 是的,这只是一个例子...但是有几个标志在用户名中并不合适,例如 /,(空白), ', ",...

标签: ruby-on-rails regex unit-testing ruby-on-rails-3 rspec


【解决方案1】:

您在这里并不是在真正测试您的模型,而是在测试您的正则表达式。这不完全一样。此外,您正在测试您的正则表达式的相同方面,它只允许 [a-zA-z0-9_.],一次又一次。如果您想应用不同的测试,请测试它的不同方面,例如使用“lo”(18 个字符)。

另外,如果你想把它弄干,你可以做类似的事情

invalid_logins = ["b lah","bälah","b@lah","bülah","bßlah","b!lah","b%lah","b)lah"]
invalid_logins.each do |s|
  it { should_not allow_value(s).for(:login) }
end

【讨论】:

  • 是的,但是大约有成千上万种不同的特殊标志......而且我认为将这些标志列入白名单并不安全......?
  • 就像 Max 说的那样,在某个点之后,您只是在测试“[a-ZA-Z0-9_.]”是否按照它所说的那样做,它总是会这样做。如果您真的偏执,请测试几次,然后称其为好。
  • 是的,正则表达式本身非常可靠。当正则表达式产生意想不到的结果时,那是因为编写它们的人不理解规则。在这种情况下,您可以相信 [a-ZA-Z0-9_.] 将只允许这些字符。它不会因为不寻常或其他原因而突然让某个新角色通过。
  • 而且,作为滥用正则表达式的一个例子,我们都做到了!你有 [a-zA-z0-9_.] 应该是 [a-zA-Z0-9_.],而 rspeicher 有 [a-ZA-Z0-9_.] 也应该是 [a-zA- Z0-9_.]。我在上一条评论中盲目地重复了 rspecher 的错误。所有这些错误都会产生意想不到的结果。
猜你喜欢
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 2014-10-21
相关资源
最近更新 更多