2017-01-12 7 views
0

私はチュートリアルを以下していると私は、モデル自体が含まれた電子メールアドレス重複したユーザーのテストに失敗しましたか?

テスト/モデル/ user_test.rb

require 'test_helper' 

class UserTest < ActiveSupport::TestCase 

. 
. 
. 


    test "email addresses should be unique" do 
    duplicate_user = @user.dup 
    duplicate_user.email = @user.email.upcase 
    @user.save 
    assert_not duplicate_user.valid? 
    end 

の一意性のための最後のテストを書いたまで、これまでのところ、私のテストが成功しています次の検証。私はブールエラーに

" test_email_addresses_should_be_unique#UserTest (0.87s) 
     Expected true to be nil or false" 

を取得し、最後のテストと

アプリ/モデル/ user.rb

class User < ApplicationRecord 
    before_save { self.email = email.downcase! } 
    validates :name, presence: true, length: { maximum: 50 } 
    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i 
    validates :email, presence: true, length: { maximum: 255 }, 
        format: { with: VALID_EMAIL_REGEX }, 
        uniqueness: { case_sensitive: false } 
        has_secure_password 
    validates :password, presence: true, length: { minimum: 6 } 
end 

私は、大文字と小文字の区別を省略する一意性の検証を設定します。したがって、重複したユーザーを無効にしないでください。

完全なテスト: テスト/モデル/ user_test.rb

require 'test_helper' 

class UserTest < ActiveSupport::TestCase 

    def setup 
    @user = User.create(name: "Example User", email: "[email protected]", 
        password: "foobar", password_confirmation: "foobar") 
    end 

    test "should be valid" do 
    assert @user.valid? 
    end 

    test "name should not be too long" do 
    @user.name = "a" * 51 
    assert_not @user.valid? 
    end 

    test "email should not be too long" do 
    @user.email = "a" * 244 + "@example.com" 
    assert_not @user.valid? 
    end 

    test "email validation should accept valid addresses" do 
    valid_addresses = %w[[email protected] [email protected] [email protected] 
         [email protected] [email protected]] 
    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[[email protected],com user_at_foo.org [email protected] 
          [email protected]_baz.com [email protected]+baz.com] 
    invalid_addresses.each do |invalid_address| 
     @user.email = invalid_address 
     assert_not @user.valid?, "#{invalid_address.inspect} should be invalid" 
    end 
    end 

    test "email addresses should be unique" do 
    duplicate_user = @user.dup 
    duplicate_user.email = @user.email.upcase 
    @user.save! 
    assert_not duplicate_user.valid? 
    end 
+0

「@ user」とは何ですか?ユーザーはデータベースに保存されますか?ユーザーが存在することを再度確認しましたか? – spickermann

+0

更新しました。はい、ユーザーはデータベースに保存されます。 – MisterCal

+0

一意性検証は、他のユーザーがデータベースに既に保存されている場合にのみ考慮します。あなたの 'setup'で' @user = User.create(...) 'を使ってテストを緑色にする必要があります。それが助けられたら教えてください:) – Raffael

答えて

2

私は私のマシン上で、あなたのコードを試し、問題がbefore_saveコールバックであるようです。

bangのバージョンdowncase!は文字列自体を変更し、変更があった場合(つまり、文字が縮小されている場合)は結果を返し、そうでない場合はnilを返します。

downcaseは、すべての文字が小文字の文字列のコピーを返します。したがって、次のいずれかの方法を使用できます。before_save { self.email = email.downcase }またはbefore_save { email.downcase! }

+0

私のために働きました!ありがとう – MisterCal

関連する問題