Temping allows you to create arbitrary ActiveRecord models backed by a temporary SQL table for use in tests. You may need to do something like this if you're testing a module that is meant to be mixed into ActiveRecord models without relying on a concrete class.
Temping will use your existing database connection. As we're using temporary tables all data will be dropped when the database connection is terminated.
The basic setup of a model involves calling create with a symbol that represents the class name of the model you wish to create. By default, this will create a temporary table with an id column.
Temping.create :dog Dog.create => #<Dog id: 1> Dog.table_name => "dogs" Dog => Dog(id: integer)
Additional database columns can be specified via the with_columns method which uses Rails migration syntax:
Temping.create :dog do with_columns do |t| t.string :name t.integer :age, :weight end end Dog.create # => #<Dog id: 1, name: nil, age: nil, weight: nil>
When a block is passed to create, it is evaluated in the context of the class. This means anything you do in an ActiveRecord model class body can be accomplished in the block including method definitions, validations, module includes, etc.
Temping.create :dog do validates :name, presence: true with_columns do |t| t.string :name t.integer :age, :weight end def quack "arf!" end end Dog.create! # => ActiveRecord::RecordInvalid: Validation failed: Name can't be blank codey = Dog.create! name: "Codey" codey.quack # => "arf!"
In your Gemfile:
test_helper.rb add the following block to
class ActiveSupport::TestCase # ... teardown do Temping.teardown end # ... end
Or, if you're using
spec_helper.rb add the following block to
RSpec.configure do |config| # ... config.after do Temping.teardown end # ... end
Alternatively you may want to just cleanup tables, but keep defined models:
Bugs, Features, Feedback
All contributions are welcome! Please take a look at
CONTRIBUTING.md for some