2017-08-27 22 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