Man page - combust(1)
Packages contains this manual
apt-get install ruby-combustion
Manual
COMBUSTION
NAMEUsage
Configuring a different test app directory
Configuring which Rails modules should be loaded.
Using Models and ActiveRecord
Disabling Database Preparation
Configuring Combustion to initialise the test db from a .sql file insteadof schema.rb
Using ActionController and ActionView
Customizing Rails application settings
Using other Rails-focused libraries
Environment and Logging
Rack it up
Get your test on!
Compatibility
Limitations and Known Issues
Contributing
Credits
NAME
Combustion
Combustion is a library to help you test your Rails Engines in a simple and effective manner, instead of creating a full Rails application in your spec or test folder.
It allows you to write your specs within the context of your engine, using only the parts of a Rails app you need.
Usage
Get the gem into either your gemspec or your Gemfile, depending on how you manage your engineâs dependencies:
# gemspec
gem.add_development_dependency âcombustionâ,
âË> 1.3â
# Gemfile
gem âcombustionâ, âË>
1.3â
In your spec_helper.rb , get Combustion to set itself up - which has to happen before you introduce rspec/rails and - if being used - capybara/rails . Hereâs an example within context:
require âbundlerâ
Bundler.require :default, :development
# If
youâre using all parts of Rails:
Combustion.initialize! :all
# Or, load just what you need:
# Combustion.initialize! :active_record,
:action_controller
require
ârspec/railsâ
# If youâre using Capybara:
# require âcapybara/railsâ
RSpec.configure
do |config|
config.use_transactional_fixtures = true
end
Please note that using :all as an argument for Combustion.initialize! will load all key parts of Rails that are considered essential for that version. For example: ActiveJob is only loaded for Rails 4.2 onwards, and Sprockets is only loaded for Rails 3.1-6.1 (as it is no longer part of the default set in 7.0).
Youâll also want to run the generator that creates a minimal set of files expected by Rails - run this in the directory of your engine:
combust
# or, if
bundling with the git repo:
bundle exec combust
Minitest support is considered to be experimental, but itâs certainly working for some . Comments on othersâ experiences are welcome!
What Combustion is doing is setting up a Rails application at spec/internal - but you only need to add the files within that directory that youâre going to use. Read on for some detail about what that involves.
If you want to use Cucumber, I recommend starting with these notes in issue #16 from Niklas Cathor.
Configuring a different test app directory
If you want your app to be located somewhere other than spec/internal , then make sure you configure it before you call Combustion.initialize! :
Combustion.path =
âspec/dummyâ
Combustion.initialize! :all
Configuring which Rails modules should be loaded.
By default, Combustion doesnât come with any of the Rails stack. You can customise this though - just pass in what youâd like loaded to the Combustion.initialize! call:
Combustion.initialize!
:active_record, :action_controller,
:action_view, :sprockets
And then in your engineâs Gemfile:
group :test do
gem âactiverecordâ
gem âactionpackâ # action_controller,
action_view
gem âsprocketsâ
end
Make sure to specify the appropriate version that you want to use.
ActiveSupport and Railties are always loaded, as theyâre an integral part of Rails.
Using Models and ActiveRecord
If youâre using ActiveRecord, then there are two critical files within your internal Rails app at spec/internal that youâll need to modify:
|
⢠|
config/database.yml |
|||
|
⢠|
db/schema.rb |
Both follow the same structure as in any normal Rails application - and the schema file lets you avoid migrations, as it gets run whenever the test suite starts. Hereâs a quick sample (note that tables are overwritten if they already exist - this is necessary):
ActiveRecord::Schema.define do
create_table(:pages, :force => true) do |t|
t.string :name
t.text :content
t.timestamps
end
end
Disabling Database Preparation
If you are preparing your own database manually or through different processes, you can disable different parts of the setup process by the following flags: :database_reset , :load_schema , and :database_migrate . All default to true.
Combustion.initialize!
:active_record,
:database_reset => false,
:load_schema => false
Configuring Combustion to initialise the test db from a .sql file insteadof schema.rb
Name the file structure.sql and configure Combustion to use it before initialising:
Combustion.schema_format = :sql
Combustion.initialize! :all
Any models that arenât provided by your engine should be located at spec/internal/app/models .
Using ActionController and ActionView
Youâll only need to add controllers and views to your internal Rails app for whatever youâre testing that your engine doesnât provide - this may be nothing at all, so perhaps you donât even need spec/internal/app/views or spec/internal/app/controllers directories.
However, if youâre doing any testing of your engineâs controllers or views, then youâre going to need routes set up for them - so modify spec/internal/config/routes.rb accordingly:
Rails.application.routes.draw
do
resources :pages
end
Just like in a standard Rails app, if you have a mounted engine, then its routes are accessible through whatever it has been loaded as.
Customizing Rails application settings
If you would like to specify any Rails configuration parameter, you can do it without creating any environment file, simply passing a block to Combustion.initialize! like this:
Combustion.initialize! :all do
config.active_record.whitelist_attributes = false
end
Values given through the initialize! block will be set during Rails initialization process, exactly before the corresponding environment file inside spec/internals/config/enviroments is loaded (when that file exists), overriding Combustionâs defaults.
Parameters defined in, for instance, spec/internals/config/environments/test.rb , would override Combustionâs defaults and also config settings passed to initialize!.
Using other Rails-focused libraries
Be aware that other gems may require parts of Rails when theyâre loaded, and this could cause some issues with Combustionâs own setup. You may need to manage the loading yourself by setting :require to false in your Gemfile for the gem in question, and then requiring it manually in your spec_helper. View issue #33 for an example with FactoryBot.
Environment and Logging
Your tests will execute within the test environment for the internal Rails app - and so logs are available at spec/internal/log/test.log . You should probably create that log directory so Rails doesnât complain.
Rack it up
Once youâve got this set up, you can fire up your test environment quite easily with Rack - a config.ru file is provided by the generator. Just run rackup and visit http://localhost:9292
Get your test on!
Now youâre good to go - you can write specs within your engineâs spec directory just like you were testing a full Rails application - models in spec/models , controllers in spec/controllers . If you bring Capybara into the mix, then the standard helpers from that will be loaded as well.
require âspec_helperâ
describe Page
do
describe â#validâ do
it ârequires a nameâ do
# This is just an example. Go write your own tests!
end
end
end
Compatibility
The current test matrix covers MRI 2.4 to 3.1, and Rails 3.1 to 7.0. It will possibly work on older versions and other Ruby implementations as well.
You can also use Combustion with multiple versions of Rails to test compatibility across them. Appraisal is a gem that can help with this, and a good starting reference is the Thinking Sphinx test suite, which runs against multiple versions of Rails.
Limitations and Known Issues
Combustion is currently written with the expectation itâll be used with RSpec, but others have got it working with Minitest . Iâd love to make this more flexible - if you want to give it a shot before I get around to it, patches are very much welcome.
Iâve not tried using this with Cucumber, but it should work in theory without too much hassle. Let me know if Iâm wrong!
Contributing
Please note that this project now has a Contributor Code of Conduct . By participating in this project you agree to abide by its terms.
Contributions are very much welcome - but keep in mind the following:
|
⢠|
Keep patches in a separate branch |
||
|
⢠|
Donât mess with the version or history file. Iâll take care of that when the patch is merged in. |
The tests are extremely minimal, and patches to extend the suite are especially welcome.
Credits
Copyright (c) 2011-2021, Combustion is developed and maintained by Pat Allan, and is released under the open MIT Licence. Many thanks to HyperTiny for encouraging its development, and all who have contributed patches .