工厂女孩has_many

时间:2016-05-06 15:25:47

标签: ruby-on-rails rspec

我如何创建具有关联的对象

我有Post模型和PostsPhoto

  PostsPhoto => belongs_to :post
  Post => has_many :post_photos, dependent: :destroy,class_name: 'PostsPhoto'

我试过了

 FactoryGirl.define do
  factory :post do
    article Faker::Lorem.paragraph(4)
    video 'http://youtube.com'
    author Faker::Name.name
    category 'article'
    title Faker::Name.title
    post_photos
  end
end

并且已经

  NoMethodError: undefined method `each' for #<PostsPhoto:0x007ff68e3bd698>

我无法使用after(:create) {},因为我在创建

上验证了它
  def check_slider_photo
    errors.add(:post_photos, 'Add post photos') if self.post_photos.size <= 0
  end

我想要create(:post)=> returns me post object with post_photos

2 个答案:

答案 0 :(得分:0)

有几种方法可以解决这个问题。这取决于您正在测试的内容,但如果您不需要更改对象或在查询中使用它们,请尝试使用build_stubbed而不是create

也就是说,如果您通常说FactoryGirl.create(:post),请尝试改为FactoryGirl.build_stubbed(:post)

另一种选择是不在测试中运行验证并单独测试验证。要做到这一点你可以说

post = FactoryGirl.build(:post)
post.save(validate: false)

然后创建其他对象并传递它们post.id快乐测试。

答案 1 :(得分:0)

试试这个:

FactoryGirl.define do
  factory :post do
    article Faker::Lorem.paragraph(4)
    video 'http://youtube.com'
    author Faker::Name.name
    category 'article'
    title Faker::Name.title

    factory :post_with_photos do
      ignore do
        photos_count 3
      end

      after(:build) do |post, evaluator|
        post.post_photos << build_list(:post_photo, evaluator.photos_count)
      end
    end
  end
end