我有以下正则表达式来验证电子邮件VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
我还有以下测试功能
test "valid signup information" do
get signup_path
assert_difference 'User.count', 1 do
post users_path, params: { user: { first_name: "John",
last_name: "Doe",
email: "john@doe.com",
password: "foobar123",
password_confirmation: "foobar123" } }
end
follow_redirect!
assert_template 'users/show'
assert is_logged_in?
end
然而,只有当电子邮件设置为john@doe.com
时,测试才会失败
每个其他相同格式的邮件都有效。我不明白为什么。
此外,当我尝试手动注册时,john@doe.com
地址的效果非常好。
使用john@doe.com
Running via Spring preloader in process 5405
Started with run options --seed 28654
FAIL["test_valid_signup_information", UsersSignupTest, 1.127243652001198]
test_valid_signup_information#UsersSignupTest (1.13s)
"User.count" didn't change by 1.
Expected: 2
Actual: 1
test/integration/users_signup_test.rb:19:in `block in <class:UsersSignupTest>'
20/20: [=============================================================================================================================================================] 100% Time: 00:00:01, Time: 00:00:01
Finished in 1.14680s
谢谢,
答案 0 :(得分:1)
正则表达式很好,您可以通过在终端中进行检查:
> 'john@doe.com' =~ /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
=> 0
失败只表示用户数没有变化。所以它可能是真的。运行测试后,使用rails c test
打开控制台,并尝试手动创建失败的用户。您将看到为什么它不会在您的测试环境中创建。
答案 1 :(得分:0)
你的正则表达式模式不是很好。
.@..com
a_b@d_e.com
-
放在字符类的结尾或开头,则不需要将其转义。 [\w+.-]
^
和$
更常用。电子邮件模式匹配是一个难题。我建议谷歌搜索它而不是想出你自己的模式。或者让模式只捕获基本错误,通过电子邮件发送地址会告诉您它是否有效。
此外,您的电子邮件模式应该有自己的测试,以隔离它的正常工作。然后,当您测试注册方法时,您只测试属于该代码的代码。