minitest-hooks adds around and before_all/after_all/around_all hooks for Minitest. This allows you do things like run each suite of specs inside a database transaction, running each spec inside its own savepoint inside that transaction, which can significantly speed up testing for specs that share expensive database setup code.
gem install minitest-hooks
Source code is available on GitHub at github.com/jeremyevans/minitest-hooks
require 'minitest/hooks/default'
First, you need to require the library.
require 'minitest/hooks'
You can set the default for some specs to be Minitest::HooksSpec
:
MiniTest::Spec.register_spec_type(/something/, Minitest::HooksSpec)
Alternatively, you can include Minitest::Hooks
in a specific spec class:
describe 'something' do include Minitest::Hooks end
To run code before any specs in the suite are executed, pass :all
to before
:
describe 'something' do before(:all) do DB[:table].insert(:column=>1) end end
To run code after all specs in the suite are executed, pass :all
to after
:
describe 'something' do after(:all) do DB[:table].delete end end
To run code around each spec in a suite, call around
with a block, and have the block call super
:
describe 'something' do around do |&block| DB.transaction(:rollback=>:always, :savepoint=>true, :auto_savepoint=>true) do super(&block) end end end
To run code around all specs in a suite, call around(:all)
with a block, and have the block call super
:
describe 'something' do around(:all) do |&block| DB.transaction(:rollback=>:always) do super(&block) end end end
Create a subclass of Minitest::Test
and include Minitest::Hooks
, and have your test classes subclass from that subclass:
require 'minitest/hooks' class MyTest < Minitest::Test include Minitest::Hooks end class TestSuite1 < MyTest end
You can just define the before_all
, after_all
, around
, and around_all
methods, instead of using the spec DSL. Make sure to call super when overriding the methods.
class TestSuite1 < MyTest def before_all super DB[:table].insert(:column=>1) end def after_all DB[:table].delete super end def around DB.transaction(:rollback=>:always, :savepoint=>true, :auto_savepoint=>true) do super end end def around_all DB.transaction(:rollback=>:always) do super end end end
MIT
Jeremy Evans <code@jeremyevans.net>