Зависимые атрибуты в Factory Girl - PullRequest
7 голосов
/ 10 декабря 2010

Похоже, я должен был найти очевидный ответ на эту проблему после нескольких часов поиска в Google и тестирования.

Я хочу иметь возможность установить caredate.user_id => provider.user_id в пределах фабрики caredate.

Ошибка теста:

ActiveRecord :: RecordInvalid: Проверка не удалась: пользователь должен быть таким же как пользователь провайдера

У меня есть проверка ActiveRecord, которая работает при тестировании через браузер:

class Caredate < ActiveRecord::Base //works fine when testing via browser
  belongs_to :user
  belongs_to :provider

  validates_presence_of :user_id
  validates_presence_of :provider_id
  validate :user_must_be_same_as_provider_user

  def user_must_be_same_as_provider_user
    errors.add(:user_id, "must be same as provider user") unless self.user_id == self.provider.user_id
  end

end

//factories.rb
Factory.define :user do |f| 
  f.password "test1234"
  f.sequence(:email) { |n| "foo#{n}@example.com" }
end

Factory.define :caredate do |f| 
  f.association :provider
  **f.user_id { Provider.find_by_id(provider_id).user_id }  //FAILS HERE**
end

Factory.define :provider do |f| 
  f.association :user
end

Приношу свои извинения, если на этот вопрос уже был дан ответ; Я попробовал несколько разных вариантов и не смог заставить его работать.

Обновление: это проходит проверку, поэтому я все ближе. Я мог бы взломать случайное число.

Factory.define :caredate do |f| 
  f.association :user, :id => 779
  f.association :provider, :user_id => 779
end

Ответы [ 2 ]

8 голосов
/ 11 декабря 2010
Factory.define :caredate do |f|
  provider = Factory.create(:provider)
  f.provider provider
  f.user provider.user
end
0 голосов
/ 10 декабря 2010

Попробуйте установить user_id в after_create или after_build:

Factory.define :caredate do |f|
  f.after_create { |caredate| caredate.user_id = caredate.provider.user_id }
end
...