2016-05-01 7 views
2

Я пытаюсь использовать FactoryGirl gem внутри моего приложения в режиме разработки (это для почтовых тестов more) с драгоценным камнем rails_email_preview.Rails FactoryGirl внутри приложения в разработке env

Это работает, но только на начальной странице загрузки, после перезагрузки/обновления страницы я получаю следующее сообщение об ошибке:

Factory not registered: order 

где order это название завода.

Вот мой код (это фиктивная приложение для моего Rails Engine):

спецификации/манекен/приложение/mailer_previews/MyModule/order_mailer_preview.rb

Dir[Mymodule::Core::Engine.root.join('spec', 'factories', '*')].each do |f| 
    require_dependency f 
end 

module Mymodule 
class OrderMailerPreview 
    def confirmation_email 

    o = FactoryGirl.create(:order) 

    OrderMailer.confirmation_email(o) 
    end 
end 
end 

Конечно мои заводы работает без проблем в тестовой среде.

Любая помощь будет оценена по достоинству.

EDIT:

p FactoryGirl.factories 

возвращается (после перезагрузки страницы)

#<FactoryGirl::Registry:0x007ff2c9dd29d0 @name="Factory", @items={}> 

ответ

0

Оказалось, что моя проблема связана с Devise gem. У меня есть код в моем инициализаторе, который очищает фабрики при каждой перезагрузке из-за проблемы с разработкой (описано here). Этот код работает только тогда, когда есть некоторые фабрики, поэтому не по первому запросу.

Решение было изменить конфигурации/Инициализаторы/devise.rb файл из:

ActionDispatch::Callbacks.after do 
    # Reload the factories 
    return unless (Rails.env.development? || Rails.env.test?) 

    unless FactoryGirl.factories.blank? # first init will load factories, this should only run on subsequent reloads 
    FactoryGirl.factories.clear 
    FactoryGirl.find_definitions 
    end 
end 

к:

ActionDispatch::Callbacks.before do 
    # Reload the factories 
    return unless (Rails.env.development? || Rails.env.test?) 

    FactoryGirl.definition_file_paths = [Mymodule::Core::Engine.root.join('spec', 'factories')] 

    # first init will load factories, this should only run on subsequent reloads 
    unless FactoryGirl.factories.blank? 
    FactoryGirl.factories.clear 
    FactoryGirl.sequences.clear 
    FactoryGirl.find_definitions 
    end 
end 

Примечание: before вместо after обратного вызова и пользовательские FactoryGirl.definition_file_paths определение перед тем Выполняется find_definitions.

Каждый раз, когда я пытаюсь использовать крючок after, я получаю ошибку Devise при первом вызове.

0

Вам нужно позвонить FactoryGirl.find_definitions загрузить заводскую девочка в развитии.

require 'factory_girl' 
FactoryGirl.find_definitions 

Должен сделать трюк.

+0

Я пробовал, но не повезло. Тем не менее он работает после начальной загрузки и прерывает перезагрузку с ошибкой «Factory no registered». – jmarceli

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