2017-02-17 61 views
1

我有一个卡厂(定义见下文),FactoryGirl InvalidFactoryError NoMethodError

FactoryGirl.define do 
    factory :card do 
    front { Faker::Lorem.sentence } 
    back { Faker::Lorem.sentence } 
    tags { Faker::Lorem.words(3).join(';') } 

    # associations 
    user 
    tag 
    end 
end 

当我尝试运行规范我碰到下面的错误,

An error occurred in a `before(:suite)` hook. 
Failure/Error: FactoryGirl.lint 

FactoryGirl::InvalidFactoryError: 
    The following factories are invalid: 

    * card - undefined method `each' for "eum;et;ad":String (NoMethodError) 

我不知道这是为什么发生的事情,下面的代码是我的名片模型,

class Card < ApplicationRecord 
    validates :front, presence: true 

    belongs_to :user 
    has_one :meta_sm2 
    has_many :action_records 
    has_and_belongs_to_many :tags 

    delegate :username, :email, :name, 
      to: :user, prefix: true 
end 
+0

什么是'之前(:套件)' –

+1

'tags {Faker :: Lorem.words(3).join(';')}'期待一个数组而不是字符串 – Sravan

+1

试试这个。 'tags {Faker :: Lorem.words(3)}'而不是标签'{Faker :: Lorem.words(3).join(';')}' – Sravan

回答

0

由于cardmany-manytags

tags协会预计的array,而是你通过一个字符串,

尝试,tags { Faker::Lorem.words(3) },而不是tags { Faker::Lorem.words(3).join(';') }

FactoryGirl.define do 
    factory :card do 
    front { Faker::Lorem.sentence } 
    back { Faker::Lorem.sentence } 
    tags { Faker::Lorem.words(3) } 

    # associations 
    user 
    tag 
    end 
end 
0

我已经解决了通过更改出厂代码问题到下面的代码,

FactoryGirl.define do 
    factory :card do 
    front { Faker::Lorem.sentence } 
    back { Faker::Lorem.sentence } 

    # associations 
    user 
    tag 
    meta_sm2 
    action_record 
    end 
end 

我认为上一个问题与缺失的关联有关。

1

好的,你有一个cardstags之间的HABTM协会。我真的不明白你怎么能设置tags只有数组或一个字符串,而不是相关的对象,但我仍然相信,要树立正确的HABTM协会在工厂和一个可以是这样做的:

FactoryGirl.define do 
    factory :card do 
    front { Faker::Lorem.sentence } 
    back { Faker::Lorem.sentence } 
    # tags { Faker::Lorem.words(3).join(';') } 

    # associations 
    user 


    factory :card_with_tags do 
     after(:create) do |book| 
     create_list(:tag, 3, cards: [card]) 
     end 
    end 
    end 
end 

这是在工厂建立HABTM的“轻量级”方式。我在最近的答案中提到了one中的“彻底”方法。