FactoryGirl и Rspec - PullRequest
       19

FactoryGirl и Rspec

8 голосов
/ 09 декабря 2011

Я очень зеленый в этом бизнесе TDD, поэтому любая помощь будет фантастической!

Итак, у меня есть фабрика со следующим:

FactoryGirl.define do

  factory :account do
    email "example@example.com"
    url "teststore"
  end  

end

И Rspecпроверить с помощью:

  it "fails validation without unique email" do
    account1 = FactoryGirl.create(:account)
    account2 = FactoryGirl.create(:account)
    account2.should have(1).error_on(:email)
end

Я получаю сообщение об ошибке со следующим сообщением:

  1) Account fails validation without unique email
     Failure/Error: account2 = FactoryGirl.create(:account)
     ActiveRecord::RecordInvalid:
       Validation failed: Email taken, please choose another, Url taken, please choose another
     # ./spec/models/account_spec.rb:11:in `block (2 levels) in <top (required)>'

Это правильный способ создания новых фабрик?Любые идеи, что я делаю здесь неправильно (я не сомневаюсь, что я делаю что-то совершенно неправильно!)

РЕДАКТИРОВАТЬ: я думаю вместо того, чтобы использовать «создать» наво-вторых, я могу использовать вместо этого .build, а затем .save?

Ответы [ 2 ]

15 голосов
/ 09 декабря 2011

Сохраните себя при взаимодействии с базой данных и используйте метод 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
0 голосов
/ 09 декабря 2011

Попробуйте это:

FactoryGirl.create(:account)
lambda {
  FactoryGirl.create(:account)
}.should raise_error(ActiveRecord::RecordInvalid)

Это поможет - с синтаксисом, аналогичным тому, что вы делаете.

Тем не менее, поиск «rspec validate_uniqueness_of» найдет вам несколько более элегантных подходов, чем использование фабричной девушки, как это!

...