2017-02-17 2 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

Что такое 'before (: suite)' –

+1

'tags {Faker :: Lorem.words (3) .join (';')}' ожидает массив вместо строки – Sravan

+1

попробуйте это. 'tags {Faker :: Lorem.words (3)}' вместо тегов '{Faker :: Lorem.words (3) .join (';')}' – Sravan

ответ

0

С card имеет many-many ассоциация с tags

tags ожидает array, вместо того, чтобы вы прошли строку,

Try, 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

У вас есть связь HABTM между cards и tags. Я действительно не понимаю, как вы можете установить 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.

Смежные вопросы