ruby-on-rails - rails - factory bot tutorial
Rieles 4 Utilice Fábricas de Factory Girl desde Engine (1)
Encontré que la ruta más fácil de tomar con esto era agregar un generador de instalación que simplemente copia las fábricas. También tengo el generador ejecutando la tarea de instalación de migraciones de instalación ya que las necesitaré en cualquier aplicación que use el motor.
Entonces, en lib/generators/my_engine/install/install_generator.rb
:
module MyEngine
module Generators
class InstallGenerator < Rails::Generators::Base
source_root File.expand_path(''../templates'', __FILE__)
def copy_migrations
rake("my_engine:install:migrations")
end
def copy_factories
copy_file "../path/to/spec/factories.rb", "spec/factories.rb"
end
end
end
end
Ahora, en proyectos que usan este motor, simplemente ejecuto rails generate my_engine:install
y las fábricas (y migraciones) están listas para que las utilice.
Creé un motor de rieles (completo, no montable) para proporcionar modelos a una variedad de aplicaciones de rieles diferentes. Utilizo Factory Girl Rails para probar este motor y todas las pruebas funcionan bien para el motor.
Ahora quiero poder utilizar estas fábricas en otras aplicaciones que incluyen este motor.
Las dependencias para el Gemspec se ven así:
s.add_dependency "rails", "~> 4.0.3"
s.add_dependency "mysql2", "~> 0.3.15"
s.add_development_dependency "rspec-rails", "~> 3.0.0.beta"
s.add_development_dependency "factory_girl_rails", "~> 4.4.1"
s.add_development_dependency "shoulda-matchers", "~> 2.5.0"
Y he definido mis fábricas en /spec/factories.rb:
factory :user do
...
end
Para agregar las fábricas.rb a las rutas de definición en factory girl, agregué lo siguiente a mi archivo /lib/engine_name/engine.rb:
class Engine < ::Rails::Engine
initializer "model_core.factories", :after => "factory_girl.set_factory_paths" do
FactoryGirl.definition_file_paths << File.expand_path(''../../../spec/factories.rb'', __FILE__) if defined?(FactoryGirl)
end
end
En mis aplicaciones Rails, incluyo el motor agregando lo siguiente al Gemfile:
gem ''engine_name'', git: "<GIT_LOCATION>"
También agregué factory_girl_rails a la aplicación (¿hay alguna manera de exponer esto desde el motor? En lugar de tener que especificarlo en las aplicaciones Gemfile también).
Y requiere los rieles de fábrica en spec_helper.rb:
require ''factory_girl_rails''
Ahora cuando escribo, digamos, una prueba de controlador como la siguiente:
it "saves the user to the database" do
expect{post :create, user: attributes_for(:user)}.to change{User.count}.by(1)
end
Me aparece el error: "Factory not registered: user"
He comprobado dos veces las rutas de archivo de definición de fábrica de fábrica abriendo la consola ruby y ejecutando FactoryGirl.definition_file_paths
y puedo ver el factories.rb del motor en la salida: "/ home / ... / gems / engine-name- abc123 / spec / factories.rb "
¿Hay algo más que deba hacer para que estas fábricas estén disponibles?
(He encontrado algunas preguntas similares sobre stackoverflow y más allá de eso, todas parecen apuntar a agregar esas líneas en engine.rb, o especificar espacios de nombres en el factories.rb pero no estoy usando namespaces con este motor).