使用rspec以.edu验证结尾的电子邮件

时间:2014-07-31 05:30:05

标签: ruby-on-rails regex rspec

在Hartl的教程中,我看到了以下RSpec代码

 describe "when email format is invalid" do
    it "should be invalid" do
      addresses = %w[user@foo,com user_at_foo.org example.user@foo.
                     foo@bar_baz.com foo@bar+baz.com]
      addresses.each do |invalid_address|
        @user.email = invalid_address
        expect(@user).not_to be_valid
      end
    end
  end

  describe "when email format is valid" do
    it "should be valid" do
      addresses = %w[user@foo.COM A_US-ER@f.b.org frst.lst@foo.jp a+b@baz.cn]
      addresses.each do |valid_address|
        @user.email = valid_address
        expect(@user).to be_valid
      end
    end
  end

第一种是测试无效的电子邮件,第二种是测试有效的电子邮件。我理解提交给我的大部分内容,但现在我想调整它,以便只接受以.edu结尾的电子邮件。想到几个问题:

  1. 为什么有效和无效的测试?不会有任何未通过有效的测试无效,反之亦然?

  2. 我看到在有效测试中,它们是有效的,因为遵循一些“普通电子邮件”约定。可以简单地用.edu替换.com和.org来实现我的目标吗?

  3. 我知道关于.edu规则的正则表达式,但我真的想学习RSPec而不是仅仅通过它。任何建议将不胜感激!

2 个答案:

答案 0 :(得分:0)

对于以edu结尾的电子邮件,您需要将以下正则表达式添加到user.rb模型中。

类似的东西:

validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+edu)\z/i
  
      
  1. 为什么两个测试都有效且无效?不会有任何测试   不通过有效无效,反之亦然?
  2.   

编写测试时要记住rspec be_valid。使用未验证的值创建User对象时。保存对象返回false。 Rspec检查保存是否有任何错误。

您也可以这样做。

创建User的对象。

@user = User.new

假设您的用户模型中有:

validates :email, :presence => true

然后尝试保存此@user

@user.save

它不会保存。您可以通过以下方式检查错误:

@user.errors
  
      
  1. 我看到在有效测试中,它们是有效的,因为遵循一些   “普通电子邮件”惯例。可以简单地替换.com和.org   用.edu实现我的目标?
  2.   

它与电子邮件约定无关。它关于你的用户模型中的正则表达式或验证

答案 1 :(得分:0)

  1. 您发布的代码是测试代码,而不是验证功能。它需要测试验证函数是否传递有效地址并拒绝无效地址。如果您只进行了一组测试,则无法确认这两种行为。例如,如果验证函数只是为任何输入返回true,而您只在电子邮件格式有效测试时执行,则您不会知道它从不拒绝无效的电子邮件

  2. 更改模型后只考虑.edu地址有效,并且您想测试它,您应该将所有非edu地址移动到中的列表中电子邮件格式无效块,并在电子邮件格式有效块时向添加一些.edu地址。