Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

In-place testing of Ruby code

branch: master

Fetching latest commit…

Octocat-spinner-32-eaf2f5

Cannot retrieve the latest commit at this time

Octocat-spinner-32 lib
Octocat-spinner-32 test
Octocat-spinner-32 .gitignore
Octocat-spinner-32 CHANGELOG
Octocat-spinner-32 Gemfile
Octocat-spinner-32 Gemfile.lock
Octocat-spinner-32 LICENSE
Octocat-spinner-32 README.md
Octocat-spinner-32 Rakefile
Octocat-spinner-32 quickie.gemspec
README.md

Quickie

Quickie is micro library for quick in-place testing of your Ruby code. It adds three useful methods: Object#should and Object#should_not for positive and negative assertions, and Object#stub for method stubbing.

With Quickie you can conveniently bundle tests along with your Ruby code, typically within if $0 == __FILE__ conditional statement.

System Requirements

Ruby 1.9.2 or later.

Installation

# Installing as Ruby gem
$ gem install quickie

# Cloning the repository
$ git clone git://github.com/michaeldv/quickie.git

Usage Example - Assertions

$ cat > 1.rb
class Account                             # Back account class.
  attr_reader :balance                    # Current account balance.

  def initialize(amount = 0)              # Open the account.
    @balance = amount.abs                 # Accept initial deposit.
  end

  def deposit(amount)                     # Accept a deposit.
    @balance += amount.abs                # Update current balance.
  end

  def status                              # Display account status.
    "Current balance: $#{balance}"
  end
end

if $0 == __FILE__                         # Execute only when running current Ruby file.
  require "quickie"                       # Require the gem.

  acc = Account.new(100)                  # Deposit $100 when opening the account.
  acc.balance.should == 100               # Initial balance should be $100.
  acc.deposit(200)                        # Deposit $200 more.
  acc.balance.should != 100               # The balance should get updated.
  acc.balance.should == 300               # $100 + $200 = $300.

  String.should === acc.status            # Account#status returns a string.
  acc.status.should_not =~ /\$$/          # Status string should contain the balance.
  acc.status.should =~ /\$\d+\.*\d*$/     # Balance contains digits with optional separator.
end
^D
$ ruby 1.rb
......

Passed: 6, not quite: 0, total tests: 6.

Usage Example - Method Stubs

To set up a stub with optional return value use obj.stub(:method, :return => value). To remove existing stub and restore original method use obj.stub(:method, :remove).

$ cat > 2.rb
require "net/http"
require "json"
require "uri"

class GemStats                            # Get gems stats from rubygems.org.
  attr_reader :downloads

  def initialize(gem, version)
    uri = URI.parse("http://rubygems.org/api/v1/downloads/#{gem}-#{version}.json")
    response = Net::HTTP.get_response(uri)
    @downloads = JSON.parse(response.body)
  end

  def total
    @downloads["total_downloads"]
  end

  def version
    @downloads["version_downloads"]
  end
end

if $0 == __FILE__
  require "quickie"

  response = { :total_downloads => 999_999, :version_downloads => 999 }.to_json
  response.stub(:body, :return => response)
  Net::HTTP.stub(:get_response, :return => response)

  stats = GemStats.new(:awesome_print, '1.0.2')

  Hash.should === stats.downloads         # Downloads should ba a hash.
  stats.downloads.keys.size.should == 2   # It should have two keys.
  stats.total.should == 999_999           # Total downloads should match test data.
  stats.version.should == 999             # Ditto for version.
end
^D
$ ruby 2.rb 
....

Passed: 4, not quite: 0, total tests: 4.

Testing Quickie

Quickie code is tested by the Quickie itself.

$ ruby test/quickie_test.rb
................................

Passed: 32, not quite: 0, total tests: 32.

Note on Patches/Pull Requests

  • Fork the project on Github.
  • Make your feature addition or bug fix.
  • Add test for it, making sure $ ruby test/*.rb all pass.
  • Commit, do not mess with Rakefile, version, or history.
  • Send me a pull request.

License

Copyright (c) 2011-12 Michael Dvorkin
twitter.com/mid
%w(mike dvorkin.net) * "@" || %w(mike fatfreecrm.com) * "@"
Released under the MIT license. See LICENSE file for details.
Something went wrong with that request. Please try again.