tutorial rails has_many factorybot docs cheatsheet bot ruby-on-rails ruby-on-rails-4 factory-bot rails-engines

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).