diff --git a/features/load_definitions.feature b/features/load_definitions.feature index 2a21163..21c49e0 100644 --- a/features/load_definitions.feature +++ b/features/load_definitions.feature @@ -1,4 +1,4 @@ -Feature: automatically load step definitions +Feature: automatically load factory definitions Background: When I successfully run `bundle exec rails new testapp` @@ -53,7 +53,34 @@ Feature: automatically load step definitions When I run `bundle exec rake test` with a clean environment Then the output should contain "1 assertions, 0 failures, 0 errors" - Scenario: use factories advertised by railties/engines/3rd-party gems + Scenario: use custom definition file paths + When I configure the factories as: + """ + config.factory_bot.definition_file_paths = ["custom_factories_path"] + """ + When I write to "custom_factories_path.rb" with: + """ + FactoryBot.define do + factory :user do + name { "Frank" } + end + end + """ + When I write to "test/unit/user_test.rb" with: + """ + require 'test_helper' + + class UserTest < ActiveSupport::TestCase + test "use factory" do + user = FactoryBot.create(:user) + assert_equal 'Frank', user.name + end + end + """ + When I run `bundle exec rake test` with a clean environment + Then the output should contain "1 assertions, 0 failures, 0 errors" + + Scenario: use 3rd-party factories with configured definition file paths When I append to "config/application.rb" with: """ require File.expand_path('../../lib/some_railtie/railties.rb', __FILE__) @@ -62,7 +89,41 @@ Feature: automatically load step definitions """ module SomeRailtie class Railtie < ::Rails::Engine + config.factory_bot.definition_file_paths << File.expand_path('../factories', __FILE__) + end + end + """ + When I write to "lib/some_railtie/factories.rb" with: + """ + FactoryBot.define do + factory :factory_from_some_railtie, class: 'User' do + name { 'Artem' } + end + end + """ + When I write to "test/unit/user_test.rb" with: + """ + require 'test_helper' + class UserTest < ActiveSupport::TestCase + test "use factory of some_railtie" do + user = FactoryBot.create(:factory_from_some_railtie) + assert_equal 'Artem', user.name + end + end + """ + When I run `bundle exec rake test` with a clean environment + Then the output should contain "1 assertions, 0 failures, 0 errors" + + Scenario: use 3rd-party factories with an initializer + When I append to "config/application.rb" with: + """ + require File.expand_path('../../lib/some_railtie/railties.rb', __FILE__) + """ + When I write to "lib/some_railtie/railties.rb" with: + """ + module SomeRailtie + class Railtie < ::Rails::Engine initializer "some_railtie.factories", :after => "factory_bot.set_factory_paths" do FactoryBot.definition_file_paths << File.expand_path('../factories', __FILE__) end diff --git a/lib/factory_bot_rails/railtie.rb b/lib/factory_bot_rails/railtie.rb index bd39882..6ccfcc2 100644 --- a/lib/factory_bot_rails/railtie.rb +++ b/lib/factory_bot_rails/railtie.rb @@ -7,17 +7,15 @@ require "rails" module FactoryBotRails class Railtie < Rails::Railtie + config.factory_bot = ActiveSupport::OrderedOptions.new + config.factory_bot.definition_file_paths = FactoryBot.definition_file_paths initializer "factory_bot.set_fixture_replacement" do Generator.new(config).run end initializer "factory_bot.set_factory_paths" do - FactoryBot.definition_file_paths = [ - Rails.root.join("factories"), - Rails.root.join("test", "factories"), - Rails.root.join("spec", "factories"), - ] + FactoryBot.definition_file_paths = definition_file_paths end initializer "factory_bot.register_reloader" do |app| @@ -27,5 +25,13 @@ module FactoryBotRails config.after_initialize do FactoryBot.find_definitions end + + private + + def definition_file_paths + config.factory_bot.definition_file_paths.map do |path| + Rails.root.join(path) + end + end end end