Прежде всего, я должен, вероятно, упомянуть, что я очень новичок в Rails, и это мой первый «серьезный» проект, поэтому я приношу свои извинения, если это простой вопрос, но Я не могу найти для этого ответа.Тест RSpec для недопущения двух пользователей с одинаковым адресом электронной почты
Я использую TDD в своем проекте и использую RSpec для написания модельных тестов FactoryGirl для создания моделей и Faker для создания фиктивных данных для моделей. Все прошло очень хорошо, пока я не добавил тест, чтобы убедиться, что у двух пользователей нет одинакового адреса электронной почты. В моей User
модели я подтверждено его следующим образом:
# /app/models/user.rb
validates :email, :password_reset_code, :auth_token, uniqueness: true
Моя фабрика создает пользовательскую модель с Faker, например так:
# /spec/factories/users.rb
FactoryGirl.define do
factory :user do
email { Faker::Internet.email }
password { Faker::Internet.password }
password_reset_code { Faker::Lorem.word }
auth_token { Faker::Lorem.word }
end
end
и мой user_spec.rb
тест на это следующим образом:
# /spec/models/user_spec.rb
it "is invalid with a duplicate email" do
user = FactoryGirl.create(:user)
FactoryGirl.create(:user, email: user.email).should_not be_valid
end
Здесь я создаю новую модель с FactoryGirl, используя ее фиктивные значения из Faker, сохраняя ее в базе данных, а затем создавая другую с тем же адресом, что и первый. Я бы ожидал, что RSpec скажет мне, что этот тест прошел из-за части should_not be_valid
. Но вместо этого я получаю этот выход, когда я запускаю тест:
Failures:
1) User is invalid with a duplicate email
Failure/Error: FactoryGirl.create(:user, email: user.email).should_not be_valid
ActiveRecord::RecordInvalid:
Validation failed: Email has already been taken
# ./spec/models/user_spec.rb:19:in `block (2 levels) in <top (required)>'
Так что, кажется, что проверка достоверности модели является повышение ошибка, которая RSpec не ловить и использовать, чтобы пройти тест? Я сумел обойти его, изменив тест на это:
it "is invalid with a duplicate email" do
begin
user = FactoryGirl.create(:user)
FactoryGirl.create(:user, email: user.email).should_not be_valid
rescue
false
end
end
который кажется работать, однако у меня есть чувство, что это не самый лучший способ сделать это.
Каков правильный способ написать этот тест?
им не уверен, если его отношение или нет, но быстрый поиск дал мне это https://github.com/rspec/rspec-expectations/blob/master/Should .md – eno3nt