Чертеж машиниста, когда модель принадлежит 2 ассоциациям has_many

#ruby-on-rails #ruby #testing #rspec #machinist

#ruby-on-rails #ruby #тестирование #rspec #машинист

Вопрос:

Окружающая среда: Ruby 1.9.2, Rails 3.1, Machinist 2

У меня есть модель транзакции, которая принадлежит как учетной записи, так и категории.

 class Transaction < ActiveRecord::Base
  belongs_to :account
  belongs_to :category

  validates_presence_of :account_id, :category_id
end

class Account < ActiveRecord::Base
  has_many :transactions
end

class Category < ActiveRecord::Base
  has_many :transactions
end
  

Я хотел бы создать чертежи машиниста для учетной записи и категории, которые создают несколько транзакций, например:

 Account.blueprint do
  name { "Account #{sn}" }
  transactions(3)
end

Category.blueprint do
  name { "Category Name #{sn}"}
  transactions(3)
end

Transaction.blueprint do
  date { Date.current }
  amount { "#{rand(100000)}.#{rand(100)}" }
  description { "Transaction description #{sn}"}
end
  

Поскольку для транзакции требуются как учетная запись, так и категория, вышеуказанные схемы не выполняются, потому что когда Account.make! вызывается, созданные транзакции не имеют связанных категорий и когда Category.make! вызывается, созданные транзакции не имеют связанных учетных записей. Я пытался вручную создавать транзакции внутри чертежей учетных записей и категорий, но в итоге получаю бесконечные циклы.

Любые советы будут с благодарностью!

Спасибо!

Ответ №1:

Попробуйте это.

Передайте массив хэшей, которые могут быть переданы отдельным чертежам. Вот пример.

 Account.blueprint do
  name         { "Accouunt#{sn}" }
  transactions { [{:amount => 10}, {:amount => 20}] }
end
  

Если вы не хотите передавать какие-либо параметры транзакции, просто передайте пустые хэши:

 Account.blueprint do
  name         { "Accouunt#{sn}" }
  transactions { [{}] * 3 } # 3 transactions
end
  

Возможно, вам потребуется явно передать параметры :category и :account соответственно, если вы столкнетесь с той же проблемой, но вы можете включить их в схему элементов.