最佳实践:Ruby/Rails Rspec正则表达式测试

Bvu*_*Ic7 3 regex unit-testing rspec ruby-on-rails ruby-on-rails-3

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

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

# 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
Run Code Online (Sandbox Code Playgroud)

但它似乎非常多余而且不安全......是否有最好的做法?谢谢!

Max*_*ams 6

你真的没有在这里测试你的模型,你正在测试你的正则表达式.这不是一回事.此外,您正在测试正则表达式的相同方面,它只允许[a-zA-z0-9_.],一次又一次.如果您想应用不同的测试,请测试它的不同方面,例如使用"lo"(<3个字符)或"12345678901234567890"(> 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
Run Code Online (Sandbox Code Playgroud)

  • 并且,作为滥用正则表达式的一个例子,我们都做到了!您有[a-zA-z0-9_。],应该是[a-zA-Z0-9_。],而rspeicher有[a-ZA-Z0-9_。],也应该是[a-zA-Z0-9_。]。 Z0-9_。]。我在最后的评论中盲目地重复了rspecher的错误。所有这些错误都会产生意想不到的结果。 (2认同)