Rails 3, Rspec / Cucumber и Factory Girl: нет ошибки метода для вложенных / связанных объектов

#ruby-on-rails #cucumber #rspec2 #factory-bot

#ruby-on-rails #cucumber #rspec2 #factory-бот

Вопрос:

Я некоторое время бился головой о стену над этим, и я не могу заставить его работать. У меня есть три модели:

 class Instrument < ActiveRecord::Base
  has_many :analytical_methods
  has_many :analytes, :through => :analytical_methods
  accepts_nested_attributes_for :analytical_methods  
  attr_accessible :name, :analytical_methods_attributes
end

class AnalyticalMethod < ActiveRecord::Base
  belongs_to :instrument
  has_many :analytes
  accepts_nested_attributes_for :analytes  
  attr_accessible :name, :analytes_attributes
end

class Analyte < ActiveRecord::Base
  belongs_to :analytical_method
  attr_accessible :name
end
  

И у меня есть следующие фабрики:

 Factory.define :analyte do |analyte|
  analyte.name "Test analyte"
end  

Factory.define :analytical_method do |analytical_method|
  analytical_method.name "Test method"
  analytical_method.association :analyte
end  

Factory.define :instrument do |instrument|
  instrument.name "Test instrument"
  instrument.association :analytical_method
  instrument.association :analyte
end
  

Каждый раз, когда я пытаюсь Factory (:instrument) или Factory (:analytical_method), он выдает следующую ошибку:

 NoMethodError:  
  undefined method `analyte=' for #<AnalyticalMethod:0x00000104c44758>
  

Я пропустил какую-то нелепую опечатку или что-то в этомроде? Веб-сайт работает отлично, но тесты продолжают давать сбои. Спасибо за любую помощь в возвращении моего здравомыслия!

Ответ №1:

Я полагаю, это потому, что вы используете instrument.association :analyte и analytical_method.association :analyte для отношения has_many. Объявление ассоциации используется для отношений belongs_to.

Обычно я не использую Factory Girl для создания has_many отношений, но если вы решите пойти этим путем, вы не первый, кто это делает. Вот сообщение в блоге, которому несколько лет, но, похоже, оно описывает то, что вы пытаетесь сделать.