2009-03-05 00:53:24 -05:00
|
|
|
h1. Database Cleaner
|
|
|
|
|
|
|
|
Database Cleaner is a set of strategies for cleaning your database in Ruby.
|
2009-08-11 17:12:00 -04:00
|
|
|
The original use case was to ensure a clean state during tests. Each strategy
|
|
|
|
is a small amount of code but is code that is usually needed in any ruby app
|
2009-03-05 00:53:24 -05:00
|
|
|
that is testing with a database.
|
|
|
|
|
2010-02-03 20:17:37 -05:00
|
|
|
ActiveRecord, DataMapper, MongoMapper and CouchPotato are supported.
|
2009-03-05 00:53:24 -05:00
|
|
|
|
|
|
|
h2. How to use
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
require 'database_cleaner'
|
|
|
|
DatabaseCleaner.strategy = :truncation
|
|
|
|
|
|
|
|
# then, whenever you need to clean the DB
|
|
|
|
DatabaseCleaner.clean
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
With the :truncation strategy you can also pass in options, for example:
|
|
|
|
<pre>
|
2009-04-27 23:54:43 -04:00
|
|
|
DatabaseCleaner.strategy = :truncation, {:only => %w[widgets dogs some_other_table]}
|
2009-03-05 00:53:24 -05:00
|
|
|
</pre>
|
|
|
|
|
|
|
|
<pre>
|
2009-04-27 23:54:43 -04:00
|
|
|
DatabaseCleaner.strategy = :truncation, {:except => %w[widgets]}
|
2009-03-05 00:53:24 -05:00
|
|
|
</pre>
|
|
|
|
|
|
|
|
(I should point out the truncation strategy will never truncate your schema_migrations table.)
|
|
|
|
|
|
|
|
|
2009-08-11 17:12:00 -04:00
|
|
|
Some strategies require that you call DatabaseCleaner.start before calling clean
|
2009-03-05 00:53:24 -05:00
|
|
|
(for example the :transaction one needs to know to open up a transaction). So
|
|
|
|
you would have:
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
require 'database_cleaner'
|
|
|
|
DatabaseCleaner.strategy = :transaction
|
2009-08-11 17:12:00 -04:00
|
|
|
|
2009-03-05 00:53:24 -05:00
|
|
|
DatabaseCleaner.start # usually this is called in setup of a test
|
|
|
|
dirty_the_db
|
|
|
|
DatabaseCleaner.clean # cleanup of the test
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
At times you may want to do a single clean with one strategy. For example, you may want
|
|
|
|
to start the process by truncating all the tables, but then use the faster transaction
|
|
|
|
strategy the remaining time. To accomplish this you can say:
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
require 'database_cleaner'
|
|
|
|
DatabaseCleaner.clean_with :truncation
|
|
|
|
DatabaseCleaner.strategy = :transaction
|
|
|
|
# then make the DatabaseCleaner.start and DatabaseCleaner.clean calls appropriately
|
|
|
|
</pre>
|
|
|
|
|
2009-03-11 00:52:15 -04:00
|
|
|
Example usage with RSpec:
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
Spec::Runner.configure do |config|
|
|
|
|
|
|
|
|
config.before(:suite) do
|
|
|
|
DatabaseCleaner.strategy = :transaction
|
|
|
|
DatabaseCleaner.clean_with(:truncation)
|
|
|
|
end
|
|
|
|
|
2009-03-11 00:53:02 -04:00
|
|
|
config.before(:each) do
|
2009-03-11 00:52:15 -04:00
|
|
|
DatabaseCleaner.start
|
|
|
|
end
|
|
|
|
|
2009-03-11 00:53:02 -04:00
|
|
|
config.after(:each) do
|
2009-03-11 00:52:15 -04:00
|
|
|
DatabaseCleaner.clean
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
</pre>
|
|
|
|
|
2009-03-05 00:53:24 -05:00
|
|
|
For use in Cucumber please see the section below.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
h2. Why?
|
|
|
|
|
2009-08-11 17:12:00 -04:00
|
|
|
One of my motivations for writing this library was to have an easy way to
|
|
|
|
turn on what Rails calls "transactional_fixtures" in my non-rails
|
2009-03-05 00:53:24 -05:00
|
|
|
ActiveRecord projects. For example, Cucumber ships with a Rails world that
|
2009-08-11 17:12:00 -04:00
|
|
|
will wrap each scenario in a transaction. This is great, but what if you are
|
2009-03-05 00:53:24 -05:00
|
|
|
using ActiveRecord in a non-rails project? You used to have to copy-and-paste
|
|
|
|
the needed code, but with DatabaseCleaner you can now say:
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
#env.rb
|
|
|
|
require 'database_cleaner'
|
|
|
|
require 'database_cleaner/cucumber'
|
|
|
|
DatabaseCleaner.strategy = :transaction
|
|
|
|
</pre>
|
|
|
|
|
2009-08-11 17:12:00 -04:00
|
|
|
Now lets say you are running your features and it requires that another process be
|
2009-03-05 00:53:24 -05:00
|
|
|
involved (i.e. Selenium running against your app's server.) You can simply change
|
|
|
|
your strategy type:
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
#env.rb
|
|
|
|
require 'database_cleaner'
|
|
|
|
require 'database_cleaner/cucumber'
|
|
|
|
DatabaseCleaner.strategy = :truncation
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
You can have the best of both worlds and use the best one for the job:
|
|
|
|
<pre>
|
|
|
|
#env.rb
|
|
|
|
require 'database_cleaner'
|
|
|
|
require 'database_cleaner/cucumber'
|
|
|
|
DatabaseCleaner.strategy = (ENV['SELENIUM'] == 'true') ? :truncation : :transaction
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
h2. COPYRIGHT
|
|
|
|
|
|
|
|
Copyright (c) 2009 Ben Mabey. See LICENSE for details.
|