FactoryGirl定义 - 未定义的关联方法

Mar*_*ser 6 ruby-on-rails factory-bot

我有以下内容

在/ app/models中:

class Area < ActiveRecord::Base
   has_many :locations
end
class Location < ActiveRecord::Base
   belongs_to :area
end
Run Code Online (Sandbox Code Playgroud)

在/app/test/factories/areas.rb中

FactoryGirl.define do
  factory :area do
    name 'Greater Chicago Area'
    short_name 'Chicago'
    latitude 42
    longitude -88
  end
  factory :losangeles, class: Area do
     name 'Los_Angeles Area'
     short_name 'Los Angeles'
     latitude 50
     longitude 90
  end
end
Run Code Online (Sandbox Code Playgroud)

在/app/test/factories/locations.rb中

FactoryGirl.define do
  factory :location do
    name "Oak Lawn"
    latitude 34
    longitude 35
    association :area
  end
  factory :malibu, class: Location do
    name "Malibu"
    latitude 60
    longitude -40
    association :losangeles
  end
end
Run Code Online (Sandbox Code Playgroud)

当我尝试运行时,我得到:

NoMethodError: undefined method `losangeles=' for #<Location:0x00000102de1478>
test/unit/venue_test.rb:10:in `block in <class:VenueTest>'
Run Code Online (Sandbox Code Playgroud)

任何帮助赞赏.

pja*_*jam 10

您收到此错误是因为您试图向malibu工厂说设置一个名为的关联losangeles,该关联不存在.存在的是losangeles创造一个的工厂Area.你想要的是:

FactoryGirl.define do
  factory :location do
    name "Oak Lawn"
    latitude 34
    longitude 35
    association :area
  end
  factory :malibu, class: Location do
    name "Malibu"
    latitude 60
    longitude -40
    association :area, factory: :losangeles
  end
end
Run Code Online (Sandbox Code Playgroud)

请参阅此处的文档

请注意,您还可以使用嵌套来定义第二个工厂:

FactoryGirl.define do
  factory :location do
    name "Oak Lawn"
    latitude 34
    longitude 35
    association :area

    factory :malibu do
      name "Malibu"
      latitude 60
      longitude -40
      association :area, factory: :losangeles
    end

  end
end
Run Code Online (Sandbox Code Playgroud)