当前正在学习Michael Hartl rails教程
在Rails中进行以下测试
test "email validation should accept valid addresses" do
valid_addresses = %w[user@example.com USER@foo.COM A_US-ER@foo.bar.org
first.last@foo.jp alice+bob@baz.cn]
valid_addresses.each do |valid_address|
@user.email = valid_address
assert @user.valid?, "#{valid_address.inspect} should be valid"
end
end
test "email validation should reject invalid addresses" do
invalid_addresses = %w[user@example,com user_at_foo.org user.name@example.
foo@bar_baz.com foo@bar+baz.com]
invalid_addresses.each do |invalid_address|
@user.email = invalid_address
assert_not @user.valid?, "#{invalid_address.inspect} should be invalid"
end
end
和以下正则表达式进行电子邮件格式验证
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }
有人能给我解释一下关于正则表达式的测试是什么吗?为什么有效的测试只有user@example.com、USER@foo.COM等。如果我在valid_addresses中添加另一个元素USER@ EXAMPLE. COM会怎样?为什么Michael特别选择上面的5个示例电子邮件作为valid_addresses和5个invalid_addresses?
如果正则表达式测试所有格式,并且只返回一个特定的格式,那么我们还需要测试什么呢?
3条答案
按热度按时间6yoyoihd1#
让我们分解表达式(记住
i
修饰符使其不区分大小写):这就是本教程对电子邮件的定义(实际上,它是much more complicated),因此作者Michael Hartl编写了两个测试“有效”和“无效”(根据上述定义)电子邮件。
几乎“用户”可以是字母数字或包含
_+-.
。“域”可以是字母数字或-.
。和“TLD”只能是字母。前5封电子邮件使用这些以前的规则的许多变化作为“可接受”的电子邮件。最后5封电子邮件失败的原因如下:user@example,com
-,
user_at_foo.org
-无@
user.name@example.
-.
之后无TLDfoo@bar_baz.com
-域不能包含_
foo@bar+baz.com
-域不能包含+
显然,如果你想要更具体的电子邮件匹配(或不匹配),将它们添加到测试数组中。如果你的测试失败,你知道你将需要更新你的表达式:)
fhg3lkii2#
在2023年为每个入住的人。
您可以用途:
5tmbdcev3#
我认为习惯正则表达式的最好方法是尝试不同的正则表达式,如果你尝试使用Rubular.com(就像书中推荐的那样)并粘贴:
\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z
。字母i
出现在正则表达式后面的文本框中。如果您在测试字符串部分粘贴电子邮件地址:user@example,com你会注意到电子邮件地址不匹配,但是如果你用一个点替换逗号,那么它就会匹配。第二个不正确的电子邮件地址只是测试字符@是否包含在内(在本例中没有)。第三个错误的电子邮件地址测试后缀包含一个或多个字母。第四个错误的电子邮件地址测试电子邮件地址中的@后面没有下划线。第五个错误的电子邮件地址测试电子邮件地址中的@后面没有+字符。
正确的电子邮件地址基本上测试相同的事情,但在这些电子邮件地址中下划线和加号是在电子邮件地址的右边部分,它还测试USER@foo.COM电子邮件地址是否以用户模型的小写形式保存:
before_save { self.email = email.downcase }
如果没有出现这种情况,则它在测试中不是有效的电子邮件地址。