Я изучаю ассоциации, и у меня возникают проблемы с тестированием своих ассоциаций с помощью RSpec, shoulda-matchers и FactoryGirl.
У меня есть модель игры, экземпляры которой должны принадлежать производителю, поэтому я использую проверку присутствия.
Производители могут иметь более одной связанной с ними игры, поэтому с точки зрения производителя существует связь has_many games. Кроме того, я хочу убедиться, что производитель создается только в том случае, если он связан с игрой (посредством проверки) (я не хочу отслеживать производителей, не связанных с играми).
Вот код:
class Game < ActiveRecord::Base
belongs_to :manufacturer
validates :name, presence: {message: 'The game name is required'}
validates :description, presence: {message: 'A short game description is required'}
validates :manufacturer, presence: true
end
class Manufacturer < ActiveRecord::Base
has_many :games
validates :name, presence: {message: 'The manufacturer name is required and must be unique'}
validates :name, uniqueness: {message: 'A manufacturer by this name already exits.'}, if: "name.present?"
validates :games, presence: { message: 'Every manufacturer must be associated with at least one game.' }
end
Как видите, оба они подтверждают друг друга, поэтому не будет игр без производителя и производителей без игр.
Мне сложно создать Factory с помощью FactoryGirl для создания действительного экземпляра производителя для тестирования.
Как я могу создать фабрику производителя и фабрику игр, чтобы иметь действующую фабрику, где я могу тестировать ассоциации с помощью shoulda-matchers? (БД правильно настроена со столбцами для внешних ключей и идентификаторов)
ИЗМЕНИТЬ
Я безуспешно пробовал следующее ...
ПОПРОБОВАТЬ 1
FactoryGirl.define do
factory :game do
name "Space Invaders"
description "Space Invaders was one of the early blockbuster shooting games."
release_date '1978'
association :manufacturer, strategy: :build
end
end
FactoryGirl.define do
factory :manufacturer do
name 'Atari'
games {create_list(:game, 1)}
end
end
Ошибка:
/Users/mymac/.rvm/gems/ruby-2.1.5@sr-arcade-nomad/bin/ruby_executable_hooks:15: stack level too deep (SystemStackError)
2 попытки
FactoryGirl.define do
factory :game do
name 'Space Invaders'
description "Space Invaders was one of the early blockbuster shooting games."
manufacturer 'Atari'
end
end
FactoryGirl.define do
factory :manufacturer do
name 'Atari'
games {create_list(:game, 1)}
end
end
Ошибка:
.../gems/activerecord-4.1.1/lib/active_record/associations/association.rb:216:in `raise_on_type_mismatch!': Manufacturer(#70244044131760) expected, got String(#70244001467180) (ActiveRecord::AssociationTypeMismatch)