Я получаю ниже тестовый сбой на моей фабрике товаров, у которого есть 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
Nope. Ошибка Saame. – gangelo
Ahh, возможно, 'before (: create)' запускается * после * валидация. Я пересмотрел ответ выше. Любая удача сейчас? – Ben
Это сделало это; не использовать это раньше (: xxx)? Что делать, если я хотел использовать переходные свойства? Большое спасибо :) – gangelo