Skip to content

Commit d3e593b

Browse files
eugeneiusilianah
andcommitted
Only load example group modules when they're used
Currently the example group modules for all spec types are always loaded, regardless of which type of spec is being run. Some of those modules force parts of the user's application to load; for example, RSpec::Rails::HelperExampleGroup includes ActionView::TestCase::Behavior and loading ActionView::TestCase loads all of the application's helpers. By autoloading these modules and including them lazily the first time the corresponding spec type is defined, we can avoid loading parts of the user's application unnecessarily. Co-authored-by: Iliana Hadzhiatanasova <[email protected]>
1 parent 260b3bf commit d3e593b

File tree

3 files changed

+72
-29
lines changed

3 files changed

+72
-29
lines changed

lib/rspec/rails.rb

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,24 @@
11
require 'rspec/core'
22
require 'rails/version'
33

4+
module RSpec
5+
module Rails
6+
autoload :RailsExampleGroup, 'rspec/rails/example/rails_example_group'
7+
autoload :ControllerExampleGroup, 'rspec/rails/example/controller_example_group'
8+
autoload :HelperExampleGroup, 'rspec/rails/example/helper_example_group'
9+
autoload :ModelExampleGroup, 'rspec/rails/example/model_example_group'
10+
autoload :RequestExampleGroup, 'rspec/rails/example/request_example_group'
11+
autoload :RoutingExampleGroup, 'rspec/rails/example/routing_example_group'
12+
autoload :ViewExampleGroup, 'rspec/rails/example/view_example_group'
13+
autoload :FeatureExampleGroup, 'rspec/rails/example/feature_example_group'
14+
autoload :SystemExampleGroup, 'rspec/rails/example/system_example_group'
15+
autoload :MailerExampleGroup, 'rspec/rails/example/mailer_example_group'
16+
autoload :JobExampleGroup, 'rspec/rails/example/job_example_group'
17+
autoload :ChannelExampleGroup, 'rspec/rails/example/channel_example_group'
18+
autoload :MailboxExampleGroup, 'rspec/rails/example/mailbox_example_group'
19+
end
20+
end
21+
422
# Load any of our adapters and extensions early in the process
523
require 'rspec/rails/adapters'
624
require 'rspec/rails/extensions'
@@ -11,7 +29,6 @@
1129
require 'rspec/rails/fixture_support'
1230
require 'rspec/rails/file_fixture_support'
1331
require 'rspec/rails/fixture_file_upload_support'
14-
require 'rspec/rails/example'
1532
require 'rspec/rails/vendor/capybara'
1633
require 'rspec/rails/configuration'
1734
require 'rspec/rails/active_record'

lib/rspec/rails/configuration.rb

Lines changed: 51 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,40 @@ class Configuration
4545
#
4646
# @api private
4747
def self.add_test_type_configurations(config)
48-
config.include RSpec::Rails::ControllerExampleGroup, type: :controller
49-
config.include RSpec::Rails::HelperExampleGroup, type: :helper
50-
config.include RSpec::Rails::ModelExampleGroup, type: :model
51-
config.include RSpec::Rails::RequestExampleGroup, type: :request
52-
config.include RSpec::Rails::RoutingExampleGroup, type: :routing
53-
config.include RSpec::Rails::ViewExampleGroup, type: :view
54-
config.include RSpec::Rails::FeatureExampleGroup, type: :feature
48+
config.define_derived_metadata(type: :controller) do
49+
config.include RSpec::Rails::ControllerExampleGroup, type: :controller
50+
end
51+
52+
config.define_derived_metadata(type: :helper) do
53+
config.include RSpec::Rails::HelperExampleGroup, type: :helper
54+
end
55+
56+
config.define_derived_metadata(type: :model) do
57+
config.include RSpec::Rails::ModelExampleGroup, type: :model
58+
end
59+
60+
config.define_derived_metadata(type: :request) do
61+
config.include RSpec::Rails::RequestExampleGroup, type: :request
62+
end
63+
64+
config.define_derived_metadata(type: :routing) do
65+
require "action_controller/test_case"
66+
config.include RSpec::Rails::RoutingExampleGroup, type: :routing
67+
end
68+
69+
config.define_derived_metadata(type: :view) do
70+
config.include RSpec::Rails::ViewExampleGroup, type: :view
71+
end
72+
73+
config.define_derived_metadata(type: :feature) do
74+
config.include RSpec::Rails::FeatureExampleGroup, type: :feature
75+
end
76+
5577
config.include RSpec::Rails::Matchers
56-
config.include RSpec::Rails::SystemExampleGroup, type: :system
78+
79+
config.define_derived_metadata(type: :system) do
80+
config.include RSpec::Rails::SystemExampleGroup, type: :system
81+
end
5782
end
5883

5984
# @private
@@ -192,27 +217,38 @@ def fixture_path=(path)
192217

193218
if defined?(::Rails::Controller::Testing)
194219
[:controller, :view, :request].each do |type|
195-
config.include ::Rails::Controller::Testing::TestProcess, type: type
196-
config.include ::Rails::Controller::Testing::TemplateAssertions, type: type
197-
config.include ::Rails::Controller::Testing::Integration, type: type
220+
config.define_derived_metadata(type: type) do
221+
config.include ::Rails::Controller::Testing::TestProcess, type: type
222+
config.include ::Rails::Controller::Testing::TemplateAssertions, type: type
223+
config.include ::Rails::Controller::Testing::Integration, type: type
224+
end
198225
end
199226
end
200227

201228
if RSpec::Rails::FeatureCheck.has_action_mailer?
202-
config.include RSpec::Rails::MailerExampleGroup, type: :mailer
229+
config.define_derived_metadata(type: :mailer) do
230+
config.include RSpec::Rails::MailerExampleGroup, type: :mailer
231+
end
232+
203233
config.after { ActionMailer::Base.deliveries.clear }
204234
end
205235

206236
if RSpec::Rails::FeatureCheck.has_active_job?
207-
config.include RSpec::Rails::JobExampleGroup, type: :job
237+
config.define_derived_metadata(type: :job) do
238+
config.include RSpec::Rails::JobExampleGroup, type: :job
239+
end
208240
end
209241

210242
if RSpec::Rails::FeatureCheck.has_action_cable_testing?
211-
config.include RSpec::Rails::ChannelExampleGroup, type: :channel
243+
config.define_derived_metadata(type: :channel) do
244+
config.include RSpec::Rails::ChannelExampleGroup, type: :channel
245+
end
212246
end
213247

214248
if RSpec::Rails::FeatureCheck.has_action_mailbox?
215-
config.include RSpec::Rails::MailboxExampleGroup, type: :mailbox
249+
config.define_derived_metadata(type: :mailbox) do
250+
config.include RSpec::Rails::MailboxExampleGroup, type: :mailbox
251+
end
216252
end
217253
end
218254

lib/rspec/rails/example.rb

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,3 @@
1-
require 'rspec/rails/example/rails_example_group'
2-
require 'rspec/rails/example/controller_example_group'
3-
require 'rspec/rails/example/request_example_group'
4-
require 'rspec/rails/example/helper_example_group'
5-
require 'rspec/rails/example/view_example_group'
6-
require 'rspec/rails/example/mailer_example_group'
7-
require 'rspec/rails/example/routing_example_group'
8-
require 'rspec/rails/example/model_example_group'
9-
require 'rspec/rails/example/job_example_group'
10-
require 'rspec/rails/example/feature_example_group'
11-
require 'rspec/rails/example/system_example_group'
12-
require 'rspec/rails/example/channel_example_group'
13-
require 'rspec/rails/example/mailbox_example_group'
1+
RSpec.warn_deprecation <<~WARNING
2+
Requiring rspec/rails/example.rb no longer has any effect, and it will be removed in RSpec Rails 7.
3+
WARNING

0 commit comments

Comments
 (0)