編集
質問への回答を使用して、テストを次のように変更しました。これは正しくテストされ、合格します。
describe "when email is already taken" do
let(:user_with_same_email) { @user.dup }
before do
user_with_same_email.email.upcase!
user_with_same_email.save
end
it { user_with_same_email.should_not be_valid }
end
注:この質問に対する選択された回答のように、変数がブロック内で単純に複製された場合let(:user_with_same_email) { @user.dup }
、変数を見つけることができないため、使用しないとテストが失敗します。user_with_same_email
before
User
モデルと、モデルの属性に対するさまざまな検証を含むテストファイルuser_spec.rb
があります。User
以前は、モデルuser_spec.rb
をテストするためにファイルの先頭に次のように書いていました。User
describe User do
before do
@user = User.new(name: "Example User", email: "user@example.com",
password: "foobar88", password_confirmation: "foobar88")
end
...
このモデルの作成をに移動したかったFactoryGirl
ので、factories.rb
ファイルを作成しました。
FactoryGirl.define do
factory :user do
name "foo"
email { "#{name}@example.com" }
password "foobar99"
password_confirmation "foobar99"
end
end
その後、変更しましたuser_spec.rb
:
describe User do
before do
@user = FactoryGirl.create(:user)
end
...
これで、1つを除いて、すべてのテストが以前と同じように合格します。
describe "when email is already taken" do
before do
user_with_same_email = @user.dup
user_with_same_email.email = @user.email.upcase
user_with_same_email.save
end
it { should_not be_valid }
end
`FactoryGirlがメールの一意性の検証をスキップしない限り、ここで何が問題になっているのか理解できません。
私のUser
モデル検証コード:
class User < ActiveRecord::Base
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i unless const_defined?(:VALID_EMAIL_REGEX)
has_secure_password
attr_accessible :name, :email, :password, :password_confirmation
has_many :programs
before_save { self.email.downcase! }
validates :name, presence: true, length: { maximum: 50 }
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }