rails中出现意外的正则表达式行为

时间:2017-08-27 20:37:10

标签: ruby-on-rails ruby regex

我有以下正则表达式来验证电子邮件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

谢谢,

2 个答案:

答案 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+.-]
  • 为了便于阅读:^$更常用。

电子邮件模式匹配是一个难题。我建议谷歌搜索它而不是想出你自己的模式。或者让模式只捕获基本错误,通过电子邮件发送地址会告诉您它是否有效。

此外,您的电子邮件模式应该有自己的测试,以隔离它的正常工作。然后,当您测试注册方法时,您只测试属于该代码的代码。