Сохраните себя при взаимодействии с базой данных и используйте метод build
для подобных ситуаций.
it "fails validation without unique email" do
account1 = create(:account)
account2 = build(:account)
account2.should_not be_valid
account2.should have(1).error_on(:email)
end
Вам не нужно пытаться создать учетную запись для valid?
, чтобы вернуть false. У вас есть доступ к объекту ошибок в учетной записи, даже если он просто встроен в память. Это уменьшит взаимодействие с базой данных и, следовательно, сделает ваши тесты намного быстрее.
Рассматривали ли вы использование последовательностей на ваших заводах? Я не знаю, как далеко вы продвинулись в своем опыте RSpec / FactoryGirl, но вы обнаружите, что такие вещи, как следующие, очень полезны.
factories.rb
factory :account do
sequence(:email) { |n| "user#{n}@example.com" }
url "teststore"
end
Каждый раз, когда вы звоните build
или create
на фабрику аккаунтов, вы будете получать уникальные электронные письма.
Помните, что вы всегда можете указать значения для атрибутов на заводе, используя хэш опций. Поэтому, когда вы проверяете свою уникальность в учетной записи, вы должны сделать что-то вроде этого.
it "fails validation without unique email" do
account1 = create(:account, :email => "foo@bar.com")
account2 = build(:account, :email => "foo@bar.com")
account2.should_not be_valid
account2.should have(1).error_on(:email)
end