0

Я получаю ниже тестовый сбой на моей фабрике товаров, у которого есть has_many через :, validates_presence_of отношения с моей моделью категорий. Категории должны существовать до создания статьи, поэтому я создал привязку before (: create), create_list для создания и ассоциирования некоторых категорий с создаваемой статьей, но я получаю следующий сбой. Я также пробовал использовать связь (например, association: categories, factory:: category), но на основе того, что я прочитал, отношения, которые имеют мои модели (has_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

Nope. Ошибка Saame. – gangelo

+0

Ahh, возможно, 'before (: create)' запускается * после * валидация. Я пересмотрел ответ выше. Любая удача сейчас? – Ben

+0

Это сделало это; не использовать это раньше (: xxx)? Что делать, если я хотел использовать переходные свойства? Большое спасибо :) – gangelo