by leahneukirchen

leahneukirchen / bacon

a small RSpec clone

420 Stars 67 Forks Last release: Not found Other 115 Commits 4 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

= 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 = end

it 'should be empty' do @ary.should.not.include 1 end

it 'should have zero size' do @ary.size.should.equal 0 0.1, 0.5 end

it 'should raise on trying fetch any index' do lambda { @ary.fetch 0 }. should.raise(IndexError). message.should.match(/out of array/)

# Alternatively:
should.raise(IndexError) { @ary.fetch 0 }


it 'should have an object identity' do end

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 end

it 'should have super powers' do should.flunk "no super powers found" end end

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 ./whirlwind.rb:38 ./whirlwind.rb:3

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. and
  • 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 end end

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

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 example:

def shorterthan(maxsize) lambda { |obj| obj.size < max_size } end

[1,2,3] shorter_than(5)

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

== 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.summaryonexit 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.
  • December 21th, 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 [email protected].

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

== Copying

Copyright (C) 2007, 2008, 2012 Christian Neukirchen

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

== Links

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

Christian Neukirchen::

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.