require 'spec/runner/formatter' require 'spec/runner/context' require 'spec/runner/context_eval' require 'spec/runner/specification' require 'spec/runner/execution_context' require 'spec/runner/context_runner' require 'spec/runner/option_parser' require 'spec/runner/command_line' require 'spec/runner/drb_command_line' require 'spec/runner/backtrace_tweaker' require 'spec/runner/reporter' require 'spec/runner/spec_matcher' require 'spec/runner/extensions/object' require 'spec/runner/extensions/kernel' require 'spec/runner/spec_should_raise_handler' require 'spec/runner/spec_parser' module Spec # == Contexts and Specifications # # Rather than expressing examples in classes, RSpec uses a custom domain specific language to express # examples using contexts and specifications. # # A context is the equivalent of a fixture in xUnit-speak. It is a metaphor for the context # in which you will run your executable example - a set of known objects in a known starting state. # # context "A new account" do # # setup do # @account = Account.new # end # # specify "should have a balance of $0" do # @account.balance.should_eql Money.new(0, :dollars) # end # # end # # We use the setup block to set up the context (given), and then the specify method to # hold the example code that expresses the event (when) and the expected outcome (then). # # == Helper Methods # # A primary goal of RSpec is to keep the examples clear. We therefore prefer # less indirection than you might see in xUnit examples and in well factored, DRY production code. We feel # that duplication is OK if removing it makes it harder to understand an example without # having to look elsewhere to understand its context. # # That said, RSpec does support some level of encapsulating common code in helper # methods that can exist within a context or within an included module. # # == Setup and Teardown # # You can use setup, teardown, context_setup and context_teardown within a context: # # context "..." do # context_setup do # ... # end # # setup do # ... # end # # specify "number one" do # ... # end # # specify "number two" do # ... # end # # teardown do # ... # end # # context_teardown do # ... # end # # end # # The setup block will run before each of the specs, once for each spec. Likewise, # the teardown block will run after each of the specs. # # It is also possible to specify a context_setup and context_teardown # block that will run only once for each context, respectively before the first setup # and after the last teardown. The use of these is generally discouraged, because it # introduces dependencies between the specs. Still, it might prove useful for very expensive operations # if you know what you are doing. # # == Local helper methods # # You can include local helper methods by simply expressing them within a context: # # context "..." do # # specify "..." do # helper_method # end # # def helper_method # ... # end # # end # # == Included helper methods # # You can include helper methods in multiple contexts by expressing them within # a module, and then including that module in your context: # # module AccountExampleHelperMethods # def helper_method # ... # end # end # # context "A new account" do # include AccountExampleHelperMethods # setup do # @account = Account.new # end # # specify "should have a balance of $0" do # helper_method # @account.balance.should eql(Money.new(0, :dollars)) # end # end module Runner end end