0

我在我的Article工厂收到以下测试失败,该工厂has_many通过:,validates_presence_of与我的类别模型关系。类别需要在文章创建之前存在,所以我设置了一个before(:create),create_list钩子来创建和关联一些类别与正在创建的文章,但是我收到了下面的失败。我也尝试使用协会(例如关联:类别,工厂::类别),但基于我读过的,我的模型具有的关系(have_many:through),要求我使用before(:create )挂钩。我错过了什么?FactoryGirl:has_many:through,validates_presence_of:关联错误:不能为空?

Failures: 

    1) Factory Girl article factory is valid 
    **Failure/Error: expect(factory).to be_valid, lambda { factory.errors.full_messages.join("\n") } 
     Categories can't be blank** 
    # ./spec/support/factories_spec.rb:17:in `block (4 levels) in <top (required)>' 

模式

class User < ActiveRecord::Base 
    ... 
    has_many :articles 
    ... 
end 

class Article < ActiveRecord::Base 
    belongs_to :user 

    has_many :article_categories 
    has_many :categories, through: :article_categories 

    validates_presence_of :categories 
    ... 
end 

class Category < ActiveRecord::Base 
    has_many :article_categories 
    has_many :articles, through: :article_categories 
    ... 
end 

class ArticleCategory < ActiveRecord::Base 
    attr_accessor :article_id, :category_id 

    belongs_to :article 
    belongs_to :category 
end 

工厂

FactoryGirl.define do 
    factory :user do 
    name { Faker::Name.name } 
    email { Faker::Internet.email } 
    password '[email protected]' 
    password_confirmation '[email protected]' 
    user_name { Faker.bothify('??????????###') } 

    after(:create) do |user, evaluator| 
     create_list(:article, rand(1..3), user: user) 
    end 
    end 
end 

FactoryGirl.define do 
    factory :article do 
    title { Faker::Lorem.paragraph[0..(rand(11..63))] } 
    content { Faker::Lorem.paragraph[0..(rand(150..5000))] } 

    before(:create) do |article, evaluator| 
     create_list(:category, rand(1..3), article: article) 
    end 
    end 
end 

FactoryGirl.define do 
    factory :category do 
    name { Faker::Lorem.characters(10) } 
    end 
end 

FactoryGirl.define do 
    factory :article_category do 
    end 
end 

回答

1

工作的呢?

FactoryGirl.define do 
    factory :article do 
    title { Faker::Lorem.paragraph[0..(rand(11..63))] } 
    content { Faker::Lorem.paragraph[0..(rand(150..5000))] } 
    categories { create_list(:category, rand(1..3)) } 
    end 
end 
+0

没有。 Saame错误。 – gangelo 2014-09-30 14:36:55

+0

啊,也许'before(:create)'在验证发生后运行*。我修改了上面的答案。现在有什么运气? – Ben 2014-09-30 16:47:26

+0

这样做;没有办法使用之前使用(:xxx)?如果我想使用瞬态属性怎么办?非常感谢:) – gangelo 2014-09-30 17:15:27