Coder Social home page Coder Social logo

bacon's Introduction

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 = Array.new
  end

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

  it 'should have zero size' do
    @ary.size.should.equal 0
    @ary.size.should.be.close 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 }
  end

  it 'should have an object identity' do
    @ary.should.not.be.same_as Array.new
  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
    @ary.should.be.a 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
.....F
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

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
1..6
# 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 chneukirchen.org/repos/taptap/)

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 github.com/chneukirchen/knock/)

Implemented assertions

  • should.<predicate> and should.be.<predicate>

  • should.equal

  • should.match

  • should.be.identical_to / should.be.same_as

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

  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 shorter_than(max_size)
  lambda { |obj| obj.size < max_size }
end

[1,2,3].should.be 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.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 github.com/relevance/spec_converter.

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): github.com/chneukirchen/bacon git://github.com/chneukirchen/bacon.git

Copying

Copyright © 2007, 2008, 2012 Christian Neukirchen <purl.org/net/chneukirchen>

Bacon is freely distributable under the terms of an MIT-style license. See COPYING or www.opensource.org/licenses/mit-license.php.

Behavior-Driven Development

<behaviour-driven.org/>

RSpec

<rspec.rubyforge.org/>

test/spec

<test-spec.rubyforge.org/>

Christian Neukirchen

<chneukirchen.org/>

bacon's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

bacon's Issues

about autotest support.

I see Since version 1.0, there is autotest support. what is the autotest , which gem I need install?

Unable to find info on Cucumber integration on NON Rails ruby apps.

Hi there,

Sorry for bugging you. Been all over google and just getting food replies so I'm obviously searching wrong or my google fu is broken today. Trying to set up to write tests against FreeSWITCH and we use Bacon rather than RSpec. What do I need to do to integrate the two such that cucmber will call bacon when I run the features and it attempts to execute the steps?

It keeps looking for rspec. :/

undefined method `include'

I'm following the code on the Sinatra website (http://www.sinatrarb.com/testing.html#bacon)

When I run >bacon test.rb, I get the following output:
The HelloWorld App
0 specifications (0 requirements), 0 failures, 0 errors
./test.rb:8: undefined method include' for #<Bacon::Context:0xb750d798> (NoMethodError) from /usr/lib/ruby/gems/1.8/gems/bacon-1.1.0/bin/../lib/bacon.rb:139:ininstance_eval'
from /usr/lib/ruby/gems/1.8/gems/bacon-1.1.0/bin/../lib/bacon.rb:139:in run' from /usr/lib/ruby/gems/1.8/gems/bacon-1.1.0/bin/../lib/bacon.rb:41:inhandle_specification'
from /usr/lib/ruby/gems/1.8/gems/bacon-1.1.0/bin/../lib/bacon.rb:139:in run' from /usr/lib/ruby/gems/1.8/gems/bacon-1.1.0/bin/../lib/bacon.rb:284:indescribe'
from ./test.rb:7
from /usr/lib/ruby/gems/1.8/gems/bacon-1.1.0/bin/bacon:115:in load' from /usr/lib/ruby/gems/1.8/gems/bacon-1.1.0/bin/bacon:115 from /usr/lib/ruby/gems/1.8/gems/bacon-1.1.0/bin/bacon:114:ineach'
from /usr/lib/ruby/gems/1.8/gems/bacon-1.1.0/bin/bacon:114
from /usr/bin/bacon:19:in load' from /usr/bin/bacon:19 ./test.rb:8: undefined methodinclude' for #Bacon::Context:0xb750d798 (NoMethodError)
from /usr/lib/ruby/gems/1.8/gems/bacon-1.1.0/bin/../lib/bacon.rb:139:in instance_eval' from /usr/lib/ruby/gems/1.8/gems/bacon-1.1.0/bin/../lib/bacon.rb:139:inrun'
from /usr/lib/ruby/gems/1.8/gems/bacon-1.1.0/bin/../lib/bacon.rb:41:in handle_specification' from /usr/lib/ruby/gems/1.8/gems/bacon-1.1.0/bin/../lib/bacon.rb:139:inrun'
from /usr/lib/ruby/gems/1.8/gems/bacon-1.1.0/bin/../lib/bacon.rb:284:in describe' from ./test.rb:7 from /usr/lib/ruby/gems/1.8/gems/bacon-1.1.0/bin/bacon:115:inload'
from /usr/lib/ruby/gems/1.8/gems/bacon-1.1.0/bin/bacon:115
from /usr/lib/ruby/gems/1.8/gems/bacon-1.1.0/bin/bacon:114:in each' from /usr/lib/ruby/gems/1.8/gems/bacon-1.1.0/bin/bacon:114 from /usr/bin/bacon:19:inload'
from /usr/bin/bacon:19

Any ideas what the problem is?

cheers,

DAZ

Global before/after

I appreciate the minimalism of bacon, but there should be a possibility to supply before/after blocks that get executed for every context.

Useful for ensuring database changes by previous contexts are rolled back before new contexts are run.

Can't run (flunk) tests from TextMate with MacRuby

When running Bacon on a suite with failing tests from TextMate [or Xcode] with Ruby 1.9 (MacRuby), I get:

core:in `write:': not opened for writing (IOError)

Oddly, I don't get this if I run it from the command-line with MacRuby, or use MRI Ruby 1.8.

I don't know if this occurs with other Ruby 1.9 implementations...

How does one debug tests?

I'm struggling to workout how to debug my tests.

I've tried object.inspec but don't seem to be able to see the output.

I've also tried using the debugger gem

require 'debugger'

describe "something" do
  it "should do something" do
    debugger
  end
end

How does one go about debugging their bacon tests?

flag to turn off monkeypatch methods

I'd like to add a flag (i.e. bacon -m) which can disable all the classes bacon monkeypatches i.e. Numeric, Proc, Object. The motivation behind this is to provide a version of bacon which doesn't monkeypatch core classes while being used with bacon plugins. An example plugin would be to make bacon test-unit compatible by providing test-unit's assert_* assertions using bacon's Should class.

Pending tests

I have a use case where I'm writing a test for an API endpoint that does not yet exist. Rather than having a failing test it would be nice to be able to change it to pending, just like in rspec. I know this isn't a critical feature, but it would be nice to have.

Colored output

I use this module for my tests, and find the output much more readable:

module Bacon
  module ColoredOutput
    def handle_specification(name)
      puts spaces + name
      yield
      puts if Counter[:context_depth] == 1
    end

    def handle_requirement(description)
      print spaces

      error = yield

      print error.empty? ? "\e[32m" : "\e[1;31m"
      print "  - #{description}"
      puts error.empty? ? "\e[0m" : " [#{error}]\e[0m"
    end

    def handle_summary
      print ErrorLog  if Backtraces
      puts "%d specifications (%d requirements), %d failures, %d errors" %
        Counter.values_at(:specifications, :requirements, :failed, :errors)
    end

    def spaces
      "  " * (Counter[:context_depth] - 1)
    end
  end

  extend ColoredOutput
end

example

Would you like to integrate it?

The after block does not appear to run

require 'rubygems'
require 'bacon'

describe 'null' do
  before do
    M = :hello
  end

  it 'should be hello' do
    M.should == :hello
  end

  it 'should be hello again' do
    M.should == :hello
  end

  after do
    Object.send(:remove_const, :M)
  end
end

When i run this code i get this output:
should be hello
should be hello againt.rb:6: warning: already initialized constant M

So it appears the after() block does not run (if it did there wouldn't be the 'already initialized constant' warning)

NOTE: this code DOES work fine, without warnings in RSpec.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.