私はチュートリアルを以下していると私は、モデル自体が含まれた電子メールアドレス重複したユーザーのテストに失敗しましたか?
テスト/モデル/ 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
「@ user」とは何ですか?ユーザーはデータベースに保存されますか?ユーザーが存在することを再度確認しましたか? – spickermann
更新しました。はい、ユーザーはデータベースに保存されます。 – MisterCal
一意性検証は、他のユーザーがデータベースに既に保存されている場合にのみ考慮します。あなたの 'setup'で' @user = User.create(...) 'を使ってテストを緑色にする必要があります。それが助けられたら教えてください:) – Raffael