代码之家  ›  专栏  ›  技术社区  ›  BvuRVKyUVlViVIc7

最佳实践:Ruby/Rails Rspec regex测试

  •  2
  • BvuRVKyUVlViVIc7  · 技术社区  · 15 年前

    你能告诉我如何正确测试regex代码吗?

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

    # 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
    

    但它看起来很多余而且不安全。。。。有最佳实践吗?谢谢!

    1 回复  |  直到 15 年前
        1
  •  6
  •   Max Williams    15 年前

    你不是在测试你的模型,而是在测试你的正则表达式。这不是一回事。另外,您正在反复测试regex的同一方面,它只允许[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