Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Pull request Compare This branch is 15 commits behind chneukirchen:master.
Fetching latest commit...
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


= Bacon -- small RSpec clone.

   "Truth will sooner come out from error than from confusion."
                                               ---Francis Bacon

Bacon is a small RSpec clone weighing less than 350 LoC but
nevertheless providing all essential features.

== Whirl-wind tour

    require 'bacon'
    describe 'A new array' do
      before do
        @ary =
      it 'should be empty' do
        @ary.should.not.include 1
      it 'should have zero size' do
        @ary.size.should.equal 0 0.1, 0.5
      it 'should raise on trying fetch any index' do
        lambda { @ary.fetch 0 }.
          message.should.match(/out of array/)
        # Alternatively:
        should.raise(IndexError) { @ary.fetch 0 }
      it 'should have an object identity' do
      # Custom assertions are trivial to do, they are lambdas returning a
      # boolean vale:
      palindrome = lambda { |obj| obj == obj.reverse }
      it 'should be a palindrome' do palindrome
      it 'should have super powers' do
        should.flunk "no super powers found"

Now run it:

    $ bacon whirlwind.rb
    A new array
    - should be empty
    - should have zero size
    - should raise on trying fetch any index
    - should have an object identity
    - should be a palindrome
    - should have super powers [FAILED]
    Bacon::Error: no super powers found
    	./whirlwind.rb:39: A new array - should have super powers
    6 specifications (9 requirements), 1 failures, 0 errors

If you want shorter output, use the Test::Unit format:

    $ bacon -q whirlwind.rb
    Bacon::Error: no super powers found
    	./whirlwind.rb:39: A new array - should have super powers
    6 tests, 9 assertions, 1 failures, 0 errors

It also supports TAP:

    $ bacon -p whirlwind.rb
    ok 1        - should be empty
    ok 2        - should have zero size
    ok 3        - should raise on trying fetch any index
    ok 4        - should have an object identity
    ok 5        - should be a palindrome
    not ok 6    - should have super powers: FAILED
    # Bacon::Error: no super powers found
    # 	./whirlwind.rb:39: A new array - should have super powers
    # 	./whirlwind.rb:38
    # 	./whirlwind.rb:3
    # 6 tests, 9 assertions, 1 failures, 0 errors

    $ bacon -p whirlwind.rb | taptap -q
    Tests took 0.00 seconds.
    FAILED tests 6
       6) should have super powers: FAILED

    Failed 1/6 tests, 83.33% okay.

(taptap is available from

As of Bacon 1.1, it also supports Knock:

    $ bacon -k whirlwind.rb
    ok - should be empty
    ok - should have zero size
    ok - should raise on trying fetch any index
    ok - should have an object identity
    ok - should be a palindrome
    not ok - should have super powers: FAILED
    # Bacon::Error: no super powers found
    # 	./whirlwind.rb:39: A new array - should have super powers
    # 	./whirlwind.rb:38
    # 	./whirlwind.rb:3

    $ bacon -k whirlwind.rb | kn-sum
    6 tests, 1 failed (83.3333% succeeded)

(knock is available from

== Implemented assertions

* should.<predicate> and<predicate>
* should.equal
* should.match
* /
* should.raise(*exceptions) { }
* should.change { }
* should.throw(symbol) { }
* should.satisfy { |object| }

== Added core predicates

* Object#true?
* Object#false?
* Proc#change?
* Proc#raise?
* Proc#throw?
* Numeric#close?

== before/after

before and after need to be defined before the first specification in
a context and are run before and after each specification.

As of Bacon 1.1, before and after do nest in nested contexts.

== Shared contexts

You can define shared contexts in Bacon like this:

    shared "an empty container" do
      it "should have size zero" do

      it "should be empty" do

    context "A new array" do
      behaves_like "an empty container"

These contexts are not executed on their own, but can be included with
behaves_like in other contexts.  You can use shared contexts to
structure suites with many recurring specifications.

== Matchers

Custom matchers are simply lambdas returning a boolean value, for

  def shorter_than(max_size)
    lambda { |obj| obj.size < max_size }

  [1,2,3] shorter_than(5)

You can use modules and extend to group matchers for use in multiple

== bacon standalone runner

  -s, --specdox            do AgileDox-like output (default)
  -q, --quiet              do Test::Unit-like non-verbose output
  -p, --tap                do TAP (Test Anything Protocol) output
  -k, --knock              do Knock output
  -o, --output FORMAT      do FORMAT (SpecDox/TestUnit/Tap) output
  -Q, --no-backtrace       don't print backtraces  
  -a, --automatic          gather tests from ./test/, include ./lib/
  -n, --name NAME          runs tests matching regexp NAME
  -t, --testcase TESTCASE  runs tests in TestCases matching regexp TESTCASE

If you don't want to use the standalone runner, run
Bacon.summary_on_exit to install an exit handler showing the summary.

== Object#should

You can use Object#should outside of contexts, where the result of
assertion will be returned as a boolean.  This is nice for
demonstrations, quick checks and doctest tests.

    >> require 'bacon'
    >> (1 + 1).should.equal 2
    => true
    >> (6*9).should.equal 42
    => false

== Bacon with autotest

Since version 1.0, there is autotest support.  You need to tag your
test directories (test/ or spec/) by creating an .bacon file there.
Autotest then will find it.  bin/bacon needs to be in PATH or RUBYPATH.

== Converting specs

spec-converter is a simple tool to convert test-unit or dust style
tests to test/spec specs.

It can be found at

== Thanks to

* Michael Fellinger, for fixing Bacon for 1.9 and various improvements.
* Gabriele Renzi, for implementing Context#should.
* James Tucker, for the autotest support.
* Yossef Mendelssohn, for nested contexts.
* everyone contributing bug fixes.

== History

* January 7, 2008: First public release 0.9.

* July 6th, 2008: Second public release 1.0.
  * Add Context#should as a shortcut for Context#it('should ' + _).
  * describe now supports multiple arguments for better organization.
  * Empty specifications are now erroneous.
  * after-blocks run in the case of exceptions too.
  * Autotest support.
  * Bug fixes.

* November 30th, 2008: Third public release 1.1.
  * Nested before/after.
  * Add -Q/--no-backtraces to not show details about failed specifications.
  * Add Knock output.
  * Bug fixes.

* XXX, 2012: Fourth public release 1.2.0.
  * #satisfy will not pass arguments anymore to the block, use lexical scope.
  * Fixed Context#change?.
  * Add support for finding specs named like spec/**/*_spec.rb.
  * Contexts nest properly.
  * Timer in TestUnitOutput.
  * Nested output for SpecDoxOutput.
  * Small cleanups and more tests.

== Contact

Please mail bugs, suggestions and patches to

Git repository (patches rebased on HEAD are most welcome):

== Copying

Copyright (C) 2007, 2008 Christian Neukirchen <>

Bacon is freely distributable under the terms of an MIT-style license.

== Links

Behavior-Driven Development:: <>
RSpec:: <>
test/spec:: <>

Christian Neukirchen:: <>
Something went wrong with that request. Please try again.