2017-08-27 42 views
0

我有以下的正则表达式表达式验证电子邮件VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][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: "[email protected]", 
             password: "foobar123", 
             password_confirmation: "foobar123" } } 
    end 
    follow_redirect! 
    assert_template 'users/show' 
    assert is_logged_in? 
end 

然而,测试失败只有当电子邮件被设置为[email protected] 相同格式的作品每一个其他邮件。我看不出为什么。 此外,当我尝试手动注册后,[email protected]地址工作完全正常。

[email protected]

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

也许你的测试方法注册用户的地方,该用户已经存在,不提高用户数。 – linden2015

+0

@ linden2015真的不太可能。我怎样才能检查数据库的每一个单一的环境(产品,测试,开发?)谢谢 –

+0

我不认为你的正则表达式是问题:http://rubular.com/r/SC4XTmOwoe –

回答

1

正则表达式是好的,您可以通过在终端做检查:

> '[email protected]' =~ /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
=> 0 

失败只是说用户数没有变化。所以它可能是真的。运行测试后,使用rails c test打开控制台,然后尝试手动创建失败的用户。你会明白为什么它不会在你的测试环境中创建。

+0

谢谢。我试图在每个单独的环境中重置我的数据库。当我启动rails控制台时,User.count对于** development **和** test **环境返回0。然而,当我启动测试时,我得到了同样的错误'“User.count”没有改变1。 预计:2 实际:1 ' 虽然在控制台中,它有0表示有可能有1条记录吗? –

+0

@PierreP。也许你在运行测试时会创建一个fixture。你是否按照我所描述的步骤行事?运行测试,然后打开控制台,然后看看你有什么用户,然后从控制台尝试手动创建记录 –

+0

是的,这是因为在另一个测试中使用的夹具!谢谢 –

0

你的正则表达式模式并没有那么大测试时这里的日志信息。

  • 它匹配:[email protected]
  • 不匹配:[email protected]_e.com
  • 如果你把-末或字符类的开始,那么你不需要逃避它。 [\w+.-]
  • 为了提高可读性:^$是更为常用。

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

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

+0

请注意,'^'和'$'都不是**和'\ A'和'\ z'一样。 '^'匹配一行的开始,而'\ A'匹配字符串的开始,'$'匹配一行的结尾,'\ z'匹配字符串 –

+0

的末尾。绝对结束。我想如果你运行一个'find(pattern)'调用,那么'BAD DATA \ n VALID EMAIL'可能会通过。 – linden2015