m3talsmith / expectations forked from jamesgolick/expectations

expectations is a lightweight unit testing framework.

This URL has Read+Write access

name age message
file README Loading commit data...
file README_TEMPLATE Thu May 01 09:16:36 -0700 2008 checking in recent changes git-svn-id: http://... [jaycfields]
directory lib/ Sun May 18 05:50:31 -0700 2008 adding ola bini's patch for JtestR git-svn-id:... [jaycfields]
file rakefile.rb Thu May 01 09:16:36 -0700 2008 checking in recent changes git-svn-id: http://... [jaycfields]
directory test/ Sun May 18 05:50:31 -0700 2008 adding ola bini's patch for JtestR git-svn-id:... [jaycfields]
README
= expectations

expectations is a lightweight unit testing framework. Tests (expectations) can be written as follows 

  expect 2 do 
    1 + 1 
  end 

  expect NoMethodError do 
    Object.invalid_method_call 
  end.

expectations is designed to encourage unit testing best practices such as
  - discourage setting more than one expectation at a time
  - promote maintainability by not providing a setup or teardown method
  - provide one syntax for setting up state based or behavior based expectation
  - focus on readability by providing no mechanism for describing an expectation other than the code in the expectation.

  
Mocking is done utilizing Mocha[http://mocha.rubyforge.org]

by {Jay Fields}[http://blog.jayfields.com]

== Download and Installation

You can download expectations from here[http://rubyforge.org/projects/expectations] or install it with the following 
command.

 $ gem install expectations

== License
   
You may use, copy and redistribute this library under the same terms as Ruby itself (see 
http://www.ruby-lang.org/en/LICENSE.txt).

== TextMate

The following code can be used as a new command in TextMate for running an individual expectation.

  export LINE="$TM_LINE_NUMBER"
  export RUBYLIB="$TM_BUNDLE_SUPPORT/RubyMate${RUBYLIB:+:$RUBYLIB}"
  "${TM_RUBY:-ruby}" -- "$TM_BUNDLE_SUPPORT/RubyMate/run_script.rb"

== Usage

expectations can be used for state based and behavior based testing.

  require File.dirname(__FILE__) + "/test_helper"
  
  Expectations do
  
    # State based expectation where a value equals another value
    expect 2 do
      1 + 1
    end
  
    # State based expectation where an exception is expected. Simply expect the Class of the intended exception
    expect NoMethodError do
      Object.no_method
    end
  
    # Behavior based test using a traditional mock
    expect mock.to.receive(:dial).with("2125551212").times(2) do |phone|
      phone.dial("2125551212")
      phone.dial("2125551212")
    end
  
    # Behavior based test using a stub
    expect stub.to.receive(:dial).with("2125551212").times(2) do |phone|
      phone.dial("2125551212")
      phone.dial("2125551212")
    end
  
    # Behavior based test using a stub_everything
    expect stub_everything.to.receive(:dial).with("2125551212").times(2) do |phone|
      phone.dial("2125551212")
      phone.dial("2125551212")
    end
  
    # Behavior based test on a concrete mock
    expect Object.to.receive(:deal) do
      Object.deal
    end
  
    # State based test utilizing a stub
    expect 2 do
      stub(:two => 2).two
    end
  
    # State based test matching a Regexp
    expect /a string/ do
      "a string"
    end
  
    # State based test checking if actual is in the expected Range
    expect 1..5 do
      3
    end
  
    # State based test to determine if the object is an instance of the module
    expect Enumerable do
      []
    end
  
    # State based test to determine if the object is an instance of the class
    expect String do
      "a string"
    end
  
    # State based test to determine if the modules are the same
    expect Enumerable do
      Enumerable
    end
  
    # State based test to determine if the classes are the same
    expect String do
      String
    end
  
    # State based test with XML strings, whitespace between tags is ignored
    expect xml("<a><foo>bar</foo></a>") do
      "<a>\n\t<foo>bar</foo>  \n</a>"
    end
  
    # State based test with XML strings, whitespace between tags is ignored
    expect xml(<<-eos) do
      <one>
      <two>
      <three>4</three>
      <five> 6 </five>
      </two>
      </one>
      eos
      "<one><two><three>4</three>
      <five> 6 </five>
      </two></one>"
    end
  
    # this is normally defined in the file specific to the class
    klass = Class.new do
      def save(arg)
        record.save(arg)
      end
    end
    # State based delegation test
    expect klass.new.to.delegate(:save).to(:record) do |instance|
      instance.save(1)
    end
  
    # this is normally defined in the file specific to the class
    klass = Class.new do
      attr_accessor :started
    end
    # State based fluent interface boolean test using to be
    expect klass.new.to.be.started do |process|
      process.started = true
    end
  
    # this is normally defined in the file specific to the class
    klass = Class.new do
      attr_accessor :finished
    end
    # State based fluent interface boolean test using to have
    expect klass.new.to.have.finished do |process|
      process.finished = true
    end
  
    expect nil.to.be.nil?
    expect Object.not.to.be.nil?
  
  end

== Contributors

Matt Mower, Ola Bini, George Malamidis, Brian Guthrie, Philippe Hanrigou, Steve McLarnon, Rubikitch, Subhash Gupta