Added Rspec and Webrat plugins and started porting Selenium on Rails tests to Rspec Plain Text Stories driving Webrat driving Selenium.

This commit is contained in:
Luke Melia 2008-06-18 02:57:57 -04:00 committed by Simon Rozet
parent 7b432a74ed
commit 2c09db45c5
602 changed files with 47788 additions and 29 deletions

15
vendor/plugins/rspec/spec/README.jruby vendored Normal file
View file

@ -0,0 +1,15 @@
= Running specs on JRuby =
svn co http://svn.codehaus.org/jruby/trunk jruby
cd jruby/jruby
ant clean
ant
# put JRuby's bin dir on your PATH
jruby -S gem install rake --no-ri --no-rdoc
jruby -S gem install diff-lcs
jruby -S gem install syntax
cd ../testsuites/rspec
mkdir target
jruby -S rake checkout_code
cd target/rspec
jruby bin/spec spec -c

View file

@ -0,0 +1,19 @@
require File.dirname(__FILE__) + "/../autotest_helper"
module DiscoveryHelper
def load_discovery
require File.dirname(__FILE__) + "/../../lib/autotest/discover"
end
end
class Autotest
describe Rspec, "discovery" do
include DiscoveryHelper
it "should add the rspec autotest plugin" do
Autotest.should_receive(:add_discovery).and_yield
load_discovery
end
end
end

View file

@ -0,0 +1,206 @@
require File.dirname(__FILE__) + "/../autotest_helper"
class Autotest
module AutotestHelper
def rspec_output
<<-HERE
.............PPF
1)
'false should be false' FAILED
expected: true,
got: false (using ==)
./spec/autotest/rspec_spec.rb:203:
Finished in 0.158674 seconds
16 examples, 1 failure, 2 pending
Pending:
Autotest::Rspec handling failed results should return an array of failed examples and errors (TODO)
Autotest::Rspec tests/specs for a given file should find all the specs for a given file (TODO)
HERE
end
def common_setup
@proc = mock Proc
@kernel = mock Kernel
@kernel.stub!(:proc).and_return @proc
File.stub!(:exists).and_return true
@windows_alt_separator = "\\"
@posix_separator = '/'
@rspec_output = rspec_output
end
end
describe Rspec do
describe "selection of rspec command" do
include AutotestHelper
before(:each) do
common_setup
@rspec_autotest = Rspec.new
end
it "should try to find the spec command if it exists in ./bin and use it above everything else" do
File.stub!(:exists?).and_return true
spec_path = File.expand_path("#{File.dirname(__FILE__)}/../../bin/spec")
File.should_receive(:exists?).with(spec_path).and_return true
@rspec_autotest.spec_command.should == spec_path
end
it "should otherwise select the default spec command in gem_dir/bin/spec" do
@rspec_autotest.stub!(:spec_commands).and_return ["/foo/spec"]
Config::CONFIG.stub!(:[]).and_return "/foo"
File.should_receive(:exists?).with("/foo/spec").and_return(true)
@rspec_autotest.spec_command.should == "/foo/spec"
end
it "should raise an error if no spec command is found at all" do
File.stub!(:exists?).and_return false
lambda {
@rspec_autotest.spec_command
}.should raise_error(RspecCommandError, "No spec command could be found!")
end
end
describe "selection of rspec command (windows compatibility issues)" do
include AutotestHelper
before(:each) do
common_setup
end
it "should use the ALT_SEPARATOR if it is non-nil" do
@rspec_autotest = Rspec.new
spec_command = File.expand_path("#{File.dirname(__FILE__)}/../../bin/spec")
@rspec_autotest.stub!(:spec_commands).and_return [spec_command]
@rspec_autotest.spec_command(@windows_alt_separator).should == spec_command.gsub('/', @windows_alt_separator)
end
it "should not use the ALT_SEPATOR if it is nil" do
@windows_alt_separator = nil
@rspec_autotest = Rspec.new
spec_command = File.expand_path("#{File.dirname(__FILE__)}/../../bin/spec")
@rspec_autotest.stub!(:spec_commands).and_return [spec_command]
@rspec_autotest.spec_command.should == spec_command
end
end
describe "adding spec.opts --options" do
before(:each) do
@rspec_autotest = Rspec.new
end
it "should return the command line option to add spec.opts if the options file exists" do
File.stub!(:exist?).and_return true
@rspec_autotest.add_options_if_present.should == "-O spec/spec.opts "
end
it "should return an empty string if no spec.opts exists" do
File.stub!(:exist?).and_return false
Rspec.new.add_options_if_present.should == ""
end
end
describe "commands" do
before(:each) do
@rspec_autotest = Rspec.new
@rspec_autotest.stub!(:ruby).and_return "ruby"
@rspec_autotest.stub!(:add_options_if_present).and_return "-O spec/spec.opts"
@ruby = @rspec_autotest.ruby
@spec_command = @rspec_autotest.spec_command
@options = @rspec_autotest.add_options_if_present
@files_to_test = {
:spec => ["file_one", "file_two"]
}
# this is not the inner representation of Autotest!
@rspec_autotest.stub!(:files_to_test).and_return @files_to_test
@files_to_test.stub!(:keys).and_return @files_to_test[:spec]
@to_test = @files_to_test.keys.flatten.join ' '
end
it "should contain the various commands, ordered by preference" do
Rspec.new.spec_commands.should == [
File.expand_path("#{File.dirname(__FILE__)}/../../bin/spec"),
"#{Config::CONFIG['bindir']}/spec"
]
end
it "should make the apropriate test command" do
@rspec_autotest.make_test_cmd(@files_to_test).should == "#{@ruby} -S #{@spec_command} #{@options} #{@to_test}"
end
end
describe "mappings" do
before(:each) do
@lib_file = "lib/something.rb"
@spec_file = "spec/something_spec.rb"
@rspec_autotest = Rspec.new
@rspec_autotest.hook :initialize
end
it "should find the spec file for a given lib file" do
@rspec_autotest.should map_specs([@spec_file]).to(@lib_file)
end
it "should find the spec file if given a spec file" do
@rspec_autotest.should map_specs([@spec_file]).to(@spec_file)
end
it "should only find the file if the file is being tracked (in @file)" do
@rspec_autotest.should map_specs([]).to("lib/untracked_file")
end
end
describe "consolidating failures" do
include AutotestHelper
before(:each) do
common_setup
@rspec_autotest = Rspec.new
@spec_file = "spec/autotest/some_spec.rb"
@rspec_autotest.instance_variable_set("@files", {@spec_file => Time.now})
@rspec_autotest.stub!(:find_files_to_test).and_return true
end
it "should return no failures if no failures were given in the output" do
@rspec_autotest.consolidate_failures([[]]).should == {}
end
it "should return a hash with the spec filename => spec name for each failure or error" do
@rspec_autotest.stub!(:test_files_for).and_return "spec/autotest/some_spec.rb"
failures = [
[
"false should be false",
"expected: true,\n got: false (using ==)\n#{@spec_file}:203:"
]
]
@rspec_autotest.consolidate_failures(failures).should == {
@spec_file => ["false should be false"]
}
end
it "should not include the subject file" do
subject_file = "lib/autotest/some.rb"
@rspec_autotest.stub!(:test_files_for).and_return "spec/autotest/some_spec.rb"
failures = [
[
"false should be false",
"expected: true,\n got: false (using ==)\n#{subject_file}:143:\n#{@spec_file}:203:"
]
]
@rspec_autotest.consolidate_failures(failures).keys.should_not include(subject_file)
end
end
end
end

View file

@ -0,0 +1,6 @@
require "rubygems"
require 'autotest'
dir = File.dirname(__FILE__)
require "#{dir}/spec_helper"
require File.expand_path("#{dir}/../lib/autotest/rspec")
require "#{dir}/autotest_matchers"

View file

@ -0,0 +1,47 @@
module Spec
module Matchers
class AutotestMappingMatcher
def initialize(specs)
@specs = specs
end
def to(file)
@file = file
self
end
def matches?(autotest)
@autotest = prepare autotest
@actual = autotest.test_files_for(@file)
@actual == @specs
end
def failure_message
"expected #{@autotest.class} to map #{@specs.inspect} to #{@file.inspect}\ngot #{@actual.inspect}"
end
private
def prepare autotest
stub_found_files autotest
stub_find_order autotest
autotest
end
def stub_found_files autotest
found_files = @specs.inject({}){|h,f| h[f] = Time.at(0)}
autotest.stub!(:find_files).and_return(found_files)
end
def stub_find_order autotest
find_order = @specs.dup << @file
autotest.instance_eval { @find_order = find_order }
end
end
def map_specs(specs)
AutotestMappingMatcher.new(specs)
end
end
end

View file

@ -0,0 +1,7 @@
if __FILE__ == $0
dir = File.dirname(__FILE__)
Dir["#{dir}/**/*_spec.rb"].reverse.each do |file|
# puts "require '#{file}'"
require file
end
end

View file

@ -0,0 +1,13 @@
require 'rbconfig'
module RubyForker
# Forks a ruby interpreter with same type as ourself.
# juby will fork jruby, ruby will fork ruby etc.
def ruby(args, stderr=nil)
config = ::Config::CONFIG
interpreter = File::join(config['bindir'], config['ruby_install_name']) + config['EXEEXT']
cmd = "#{interpreter} #{args}"
cmd << " 2> #{stderr}" unless stderr.nil?
`#{cmd}`
end
end

6
vendor/plugins/rspec/spec/spec.opts vendored Normal file
View file

@ -0,0 +1,6 @@
--colour
--format
profile
--timeout
20
--diff

View file

@ -0,0 +1,10 @@
describe Spec::Adapters::RubyEngine do
it "should default to MRI" do
Spec::Adapters::RubyEngine.adapter.should be_an_instance_of(Spec::Adapters::RubyEngine::MRI)
end
it "should provide Rubinius for rbx" do
Spec::Adapters::RubyEngine.stub!(:engine).and_return('rbx')
Spec::Adapters::RubyEngine.adapter.should be_an_instance_of(Spec::Adapters::RubyEngine::Rubinius)
end
end

View file

@ -0,0 +1,282 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Example
describe Configuration do
before(:each) do
@config = Configuration.new
@example_group = mock("example_group")
end
describe "#mock_with" do
it "should default mock framework to rspec" do
@config.mock_framework.should =~ /\/plugins\/mock_frameworks\/rspec$/
end
it "should let you set rspec mocking explicitly" do
@config.mock_with(:rspec)
@config.mock_framework.should =~ /\/plugins\/mock_frameworks\/rspec$/
end
it "should let you set mocha" do
@config.mock_with(:mocha)
@config.mock_framework.should =~ /\/plugins\/mock_frameworks\/mocha$/
end
it "should let you set flexmock" do
@config.mock_with(:flexmock)
@config.mock_framework.should =~ /\/plugins\/mock_frameworks\/flexmock$/
end
it "should let you set rr" do
@config.mock_with(:rr)
@config.mock_framework.should =~ /\/plugins\/mock_frameworks\/rr$/
end
it "should let you set an arbitrary adapter module" do
adapter = Module.new
@config.mock_with(adapter)
@config.mock_framework.should == adapter
end
end
describe "#include" do
before do
@original_configuration = Spec::Runner.configuration
spec_configuration = @config
Spec::Runner.instance_eval {@configuration = spec_configuration}
@example_group_class = Class.new(ExampleGroup) do
class << self
def this_class_has_special_methods
end
end
end
ExampleGroupFactory.register(:foobar, @example_group_class)
end
after do
original_configuration = @original_configuration
Spec::Runner.instance_eval {@configuration = original_configuration}
ExampleGroupFactory.reset
end
it "should include the submitted module in ExampleGroup subclasses" do
mod = Module.new
@config.include mod
Class.new(@example_group_class).included_modules.should include(mod)
end
it "should let you define modules to be included for a specific type" do
mod = Module.new
@config.include mod, :type => :foobar
Class.new(@example_group_class).included_modules.should include(mod)
end
it "should not include modules in a type they are not intended for" do
mod = Module.new
@other_example_group_class = Class.new(ExampleGroup)
ExampleGroupFactory.register(:baz, @other_example_group_class)
@config.include mod, :type => :foobar
Class.new(@other_example_group_class).included_modules.should_not include(mod)
end
end
end
describe Configuration do
before(:each) do
@config = Configuration.new
@special_example_group = Class.new(ExampleGroup)
@special_child_example_group = Class.new(@special_example_group)
@nonspecial_example_group = Class.new(ExampleGroup)
ExampleGroupFactory.register(:special, @special_example_group)
ExampleGroupFactory.register(:special_child, @special_child_example_group)
ExampleGroupFactory.register(:non_special, @nonspecial_example_group)
@example_group = @special_child_example_group.describe "Special Example Group"
@unselected_example_group = Class.new(@nonspecial_example_group).describe "Non Special Example Group"
end
after(:each) do
ExampleGroupFactory.reset
end
describe "#prepend_before" do
it "prepends the before block on all instances of the passed in type" do
order = []
@config.prepend_before(:all) do
order << :prepend__before_all
end
@config.prepend_before(:all, :type => :special) do
order << :special_prepend__before_all
end
@config.prepend_before(:all, :type => :special_child) do
order << :special_child_prepend__before_all
end
@config.prepend_before(:each) do
order << :prepend__before_each
end
@config.prepend_before(:each, :type => :special) do
order << :special_prepend__before_each
end
@config.prepend_before(:each, :type => :special_child) do
order << :special_child_prepend__before_each
end
@config.prepend_before(:all, :type => :non_special) do
order << :special_prepend__before_all
end
@config.prepend_before(:each, :type => :non_special) do
order << :special_prepend__before_each
end
@example_group.it "calls prepend_before" do
end
@example_group.run
order.should == [
:prepend__before_all,
:special_prepend__before_all,
:special_child_prepend__before_all,
:prepend__before_each,
:special_prepend__before_each,
:special_child_prepend__before_each
]
end
end
describe "#append_before" do
it "calls append_before on the type" do
order = []
@config.append_before(:all) do
order << :append_before_all
end
@config.append_before(:all, :type => :special) do
order << :special_append_before_all
end
@config.append_before(:all, :type => :special_child) do
order << :special_child_append_before_all
end
@config.append_before(:each) do
order << :append_before_each
end
@config.append_before(:each, :type => :special) do
order << :special_append_before_each
end
@config.append_before(:each, :type => :special_child) do
order << :special_child_append_before_each
end
@config.append_before(:all, :type => :non_special) do
order << :special_append_before_all
end
@config.append_before(:each, :type => :non_special) do
order << :special_append_before_each
end
@example_group.it "calls append_before" do
end
@example_group.run
order.should == [
:append_before_all,
:special_append_before_all,
:special_child_append_before_all,
:append_before_each,
:special_append_before_each,
:special_child_append_before_each
]
end
end
describe "#prepend_after" do
it "prepends the after block on all instances of the passed in type" do
order = []
@config.prepend_after(:all) do
order << :prepend__after_all
end
@config.prepend_after(:all, :type => :special) do
order << :special_prepend__after_all
end
@config.prepend_after(:all, :type => :special) do
order << :special_child_prepend__after_all
end
@config.prepend_after(:each) do
order << :prepend__after_each
end
@config.prepend_after(:each, :type => :special) do
order << :special_prepend__after_each
end
@config.prepend_after(:each, :type => :special) do
order << :special_child_prepend__after_each
end
@config.prepend_after(:all, :type => :non_special) do
order << :special_prepend__after_all
end
@config.prepend_after(:each, :type => :non_special) do
order << :special_prepend__after_each
end
@example_group.it "calls prepend_after" do
end
@example_group.run
order.should == [
:special_child_prepend__after_each,
:special_prepend__after_each,
:prepend__after_each,
:special_child_prepend__after_all,
:special_prepend__after_all,
:prepend__after_all
]
end
end
describe "#append_after" do
it "calls append_after on the type" do
order = []
@config.append_after(:all) do
order << :append__after_all
end
@config.append_after(:all, :type => :special) do
order << :special_append__after_all
end
@config.append_after(:all, :type => :special_child) do
order << :special_child_append__after_all
end
@config.append_after(:each) do
order << :append__after_each
end
@config.append_after(:each, :type => :special) do
order << :special_append__after_each
end
@config.append_after(:each, :type => :special_child) do
order << :special_child_append__after_each
end
@config.append_after(:all, :type => :non_special) do
order << :non_special_append_after_all
end
@config.append_after(:each, :type => :non_special) do
order << :non_special_append_after_each
end
@example_group.it "calls append_after" do
end
@example_group.run
order.should == [
:special_child_append__after_each,
:special_append__after_each,
:append__after_each,
:special_child_append__after_all,
:special_append__after_all,
:append__after_all
]
end
end
end
end
end

View file

@ -0,0 +1,20 @@
require File.dirname(__FILE__) + "/../../../spec_helper"
module Spec
module Example
module AModule; end
class AClass; end
describe "With", AModule do
it "should have the described_type as 'AModule'" do
self.class.described_module.should == AModule
end
end
describe "With", AClass do
it "should have the described_module as nil" do
self.class.described_module.should be_nil
end
end
end
end

View file

@ -0,0 +1,76 @@
require File.dirname(__FILE__) + "/../../../spec_helper"
module Spec
module Example
module AModuleAutomaticallyIncluded
def call_method
@method_called = true
return "a string"
end
def method_called?
@method_called ? true : false
end
end
describe "Including modules in an example group" do
describe AModuleAutomaticallyIncluded do
before :each do
Kernel.stub!(:warn)
end
it "should return the correct values" do
self.method_called?.should be_false
self.call_method.should eql("a string")
self.method_called?.should be_true
end
it "should respond_to? the methods from the module" do
self.should respond_to(:method_called?)
self.should respond_to(:call_method)
end
it "should not respond_to? methods which do not come from the module (or are in Spec::ExampleGroup)" do
self.should_not respond_to(:adsfadfadadf_a_method_which_does_not_exist)
end
it "should respond_to? a method in Spec::ExampleGroup" do
self.should respond_to(:describe)
end
it "should issue a warning with Kernel.warn" do
Kernel.should_receive(:warn)
self.call_method
end
it "should issue a warning when the example calls the method which is automatically included" do
Kernel.should_receive(:warn).with("Modules will no longer be automatically included in RSpec version 1.1.4. Called from #{__FILE__}:#{__LINE__+1}")
self.method_called?
end
it "should issue a warning with the correct file and line numbers" do
Kernel.should_receive(:warn).with("Modules will no longer be automatically included in RSpec version 1.1.4. Called from #{__FILE__}:#{__LINE__+1}")
self.method_called?
end
end
describe AModuleAutomaticallyIncluded, "which is also manually included" do
include AModuleAutomaticallyIncluded
before :each do
Kernel.stub!(:warn)
end
it "should respond to the methods since it is included" do
self.should respond_to(:method_called?)
self.should respond_to(:call_method)
end
it "should not issue a warning, since the module is manually included" do
Kernel.should_not_receive(:warn)
self.method_called?
end
end
end
end
end

View file

@ -0,0 +1,48 @@
require File.dirname(__FILE__) + '/../../spec_helper'
module Spec
module Example
class ExampleGroupSubclass < ExampleGroup
class << self
attr_accessor :examples_ran
end
@@klass_variable_set = true
CONSTANT = :foobar
before do
@instance_variable = :hello
end
it "should run" do
self.class.examples_ran = true
end
it "should have access to instance variables" do
@instance_variable.should == :hello
end
it "should have access to class variables" do
@@klass_variable_set.should == true
end
it "should have access to constants" do
CONSTANT.should == :foobar
end
it "should have access to methods defined in the Example Group" do
a_method.should == 22
end
def a_method
22
end
end
describe ExampleGroupSubclass do
it "should run" do
ExampleGroupSubclass.examples_ran.should be_true
end
end
end
end

View file

@ -0,0 +1,144 @@
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
module Spec
module Example
describe ExampleGroupFactory do
describe "#get" do
attr_reader :example_group
before do
@example_group = Class.new(ExampleGroup)
ExampleGroupFactory.register(:registered_type, @example_group)
end
after do
ExampleGroupFactory.reset
end
it "should #get the default ExampleGroup type when passed nil" do
ExampleGroupFactory.get(nil).should == ExampleGroup
end
it "should #get the default ExampleGroup for unregistered non-nil values" do
ExampleGroupFactory.get(:does_not_exist).should == ExampleGroup
end
it "should #get custom type for :registered_type" do
ExampleGroupFactory.get(:registered_type).should == @example_group
end
it "should #get the actual type when that is passed in" do
ExampleGroupFactory.get(@example_group).should == @example_group
end
it "should get the custom type after setting the default" do
@example_group2 = Class.new(ExampleGroup)
ExampleGroupFactory.default(@example_group2)
ExampleGroupFactory.get(:registered_type).should == @example_group
end
end
describe "#create_example_group" do
attr_reader :parent_example_group
before do
@parent_example_group = Class.new(ExampleGroup) do
def initialize(*args, &block)
;
end
end
end
it "should create a uniquely named class" do
example_group = Spec::Example::ExampleGroupFactory.create_example_group("example_group") {}
example_group.name.should =~ /Spec::Example::ExampleGroup::Subclass_\d+/
end
it "should create a Spec::Example::Example subclass by default" do
example_group = Spec::Example::ExampleGroupFactory.create_example_group("example_group") {}
example_group.superclass.should == Spec::Example::ExampleGroup
end
describe "when :type => :default" do
it "should create a Spec::Example::Example" do
example_group = Spec::Example::ExampleGroupFactory.create_example_group(
"example_group", :type => :default
) {}
example_group.superclass.should == Spec::Example::ExampleGroup
end
it "should create a Spec::Example::Example" do
example_group = Spec::Example::ExampleGroupFactory.create_example_group(
"example_group", :type => :default
) {}
example_group.superclass.should == Spec::Example::ExampleGroup
end
end
describe "when :type => :something_other_than_default" do
it "should create specified type" do
Spec::Example::ExampleGroupFactory.register(:something_other_than_default, parent_example_group)
non_default_example_group = Spec::Example::ExampleGroupFactory.create_example_group(
"example_group", :type => :something_other_than_default
) {}
non_default_example_group.superclass.should == parent_example_group
end
end
it "should create a type indicated by :spec_path" do
Spec::Example::ExampleGroupFactory.register(:something_other_than_default, parent_example_group)
custom_example_group = Spec::Example::ExampleGroupFactory.create_example_group(
"example_group", :spec_path => "./spec/something_other_than_default/some_spec.rb"
) {}
custom_example_group.superclass.should == parent_example_group
end
it "should create a type indicated by :spec_path (with spec_path generated by caller on windows)" do
Spec::Example::ExampleGroupFactory.register(:something_other_than_default, parent_example_group)
custom_example_group = Spec::Example::ExampleGroupFactory.create_example_group(
"example_group",
:spec_path => "./spec\\something_other_than_default\\some_spec.rb"
) {}
custom_example_group.superclass.should == parent_example_group
end
describe "when :shared => true" do
attr_reader :shared_example_group
before do
@shared_example_group = Spec::Example::ExampleGroupFactory.create_example_group(
"name", :spec_path => '/blah/spec/models/blah.rb', :type => :controller, :shared => true
) {}
end
it "should create and register a Spec::Example::Example" do
shared_example_group.should be_an_instance_of(Spec::Example::SharedExampleGroup)
SharedExampleGroup.shared_example_groups.should include(shared_example_group)
end
end
it "should favor the :type over the :spec_path" do
Spec::Example::ExampleGroupFactory.register(:something_other_than_default, parent_example_group)
custom_example_group = Spec::Example::ExampleGroupFactory.create_example_group(
"name", :spec_path => '/blah/spec/models/blah.rb', :type => :something_other_than_default
) {}
custom_example_group.superclass.should == parent_example_group
end
it "should register ExampleGroup by default" do
example_group = Spec::Example::ExampleGroupFactory.create_example_group("The ExampleGroup") do
end
rspec_options.example_groups.should include(example_group)
end
it "should enable unregistering of ExampleGroups" do
example_group = Spec::Example::ExampleGroupFactory.create_example_group("The ExampleGroup") do
unregister
end
rspec_options.example_groups.should_not include(example_group)
end
after(:each) do
Spec::Example::ExampleGroupFactory.reset
end
end
end
end
end

View file

@ -0,0 +1,572 @@
require File.dirname(__FILE__) + '/../../spec_helper'
module Spec
module Example
describe 'ExampleGroupMethods' do
it_should_behave_like "sandboxed rspec_options"
attr_reader :example_group, :result, :reporter
before(:each) do
options.formatters << mock("formatter", :null_object => true)
options.backtrace_tweaker = mock("backtrace_tweaker", :null_object => true)
@reporter = FakeReporter.new(@options)
options.reporter = reporter
@example_group = Class.new(ExampleGroup) do
describe("ExampleGroup")
it "does nothing"
end
class << example_group
public :include
end
@result = nil
end
after(:each) do
ExampleGroup.reset
end
["describe","context"].each do |method|
describe "#{method}" do
describe "when creating an ExampleGroup" do
attr_reader :child_example_group
before do
@child_example_group = @example_group.send method, "Another ExampleGroup" do
it "should pass" do
true.should be_true
end
end
end
it "should create a subclass of the ExampleGroup when passed a block" do
child_example_group.superclass.should == @example_group
@options.example_groups.should include(child_example_group)
end
it "should not inherit examples" do
child_example_group.examples.length.should == 1
end
end
describe "when creating a SharedExampleGroup" do
attr_reader :name, :shared_example_group
before do
@name = "A Shared ExampleGroup"
@shared_example_group = @example_group.send method, name, :shared => true do
it "should pass" do
true.should be_true
end
end
end
after do
SharedExampleGroup.shared_example_groups.delete_if do |registered_shared_example_group|
registered_shared_example_group == shared_example_group
end
end
it "should create a SharedExampleGroup" do
SharedExampleGroup.find_shared_example_group(name).should == shared_example_group
end
end
end
end
describe "#it" do
it "should should create an example instance" do
lambda {
@example_group.it("")
}.should change { @example_group.examples.length }.by(1)
end
end
describe "#xit and #xspecify" do
before(:each) do
Kernel.stub!(:warn)
end
it "should NOT create an example instance" do
lambda {
@example_group.xit("")
}.should_not change(@example_group.examples, :length)
lambda {
@example_group.xspecify("")
}.should_not change(@example_group.examples, :length)
end
it "should warn that it is disabled" do
Kernel.should_receive(:warn).with("Example disabled: foo").twice
@example_group.xit("foo")
@example_group.xspecify("foo")
end
end
describe "#examples" do
it "should have Examples" do
example_group = Class.new(ExampleGroup) do
describe('example')
it "should pass" do
1.should == 1
end
end
example_group.examples.length.should == 1
example_group.examples.first.description.should == "should pass"
end
it "should not include methods that begin with test (only when TU interop is loaded)" do
example_group = Class.new(ExampleGroup) do
describe('example')
def test_any_args(*args)
true.should be_true
end
def test_something
1.should == 1
end
def test
raise "This is not a real test"
end
def testify
raise "This is not a real test"
end
def should_something
# forces the run
end
end
example_group.examples.length.should == 1
example_group.run.should be_true
end
it "should include methods that begin with should and has an arity of 0 in suite" do
example_group = Class.new(ExampleGroup) do
describe('example')
def shouldCamelCase
true.should be_true
end
def should_any_args(*args)
true.should be_true
end
def should_something
1.should == 1
end
def should_not_something
1.should_not == 2
end
def should
raise "This is not a real example"
end
def should_not
raise "This is not a real example"
end
end
example_group = example_group.dup
example_group.examples.length.should == 4
descriptions = example_group.examples.collect {|example| example.description}.sort
descriptions.should include("shouldCamelCase")
descriptions.should include("should_any_args")
descriptions.should include("should_something")
descriptions.should include("should_not_something")
end
it "should not include methods that begin with test_ and has an arity > 0 in suite" do
example_group = Class.new(ExampleGroup) do
describe('example')
def test_invalid(foo)
1.should == 1
end
def testInvalidCamelCase(foo)
1.should == 1
end
end
example_group.examples.length.should == 0
end
it "should not include methods that begin with should_ and has an arity > 0 in suite" do
example_group = Class.new(ExampleGroup) do
describe('example')
def should_invalid(foo)
1.should == 2
end
def shouldInvalidCamelCase(foo)
1.should == 3
end
def should_not_invalid(foo)
1.should == 4
end
def should_valid
1.should == 1
end
end
example_group.examples.length.should == 1
example_group.run.should be_true
end
it "should run should_methods" do
example_group = Class.new(ExampleGroup) do
def should_valid
1.should == 2
end
end
example_group.examples.length.should == 1
example_group.run.should be_false
end
end
describe "#set_description" do
attr_reader :example_group
before do
class << example_group
public :set_description
end
end
describe "#set_description(String)" do
before(:each) do
example_group.set_description("abc")
end
specify ".description should return the String passed into .set_description" do
example_group.description.should == "abc"
end
specify ".described_type should provide nil as its type" do
example_group.described_type.should be_nil
end
end
describe "#set_description(Type)" do
before(:each) do
example_group.set_description(ExampleGroup)
end
specify ".description should return a String representation of that type (fully qualified) as its name" do
example_group.description.should == "Spec::Example::ExampleGroup"
end
specify ".described_type should return the passed in type" do
example_group.described_type.should == Spec::Example::ExampleGroup
end
end
describe "#set_description(String, Type)" do
before(:each) do
example_group.set_description("behaving", ExampleGroup)
end
specify ".description should return String then space then Type" do
example_group.description.should == "behaving Spec::Example::ExampleGroup"
end
specify ".described_type should return the passed in type" do
example_group.described_type.should == Spec::Example::ExampleGroup
end
end
describe "#set_description(Type, String not starting with a space)" do
before(:each) do
example_group.set_description(ExampleGroup, "behaving")
end
specify ".description should return the Type then space then String" do
example_group.description.should == "Spec::Example::ExampleGroup behaving"
end
end
describe "#set_description(Type, String starting with .)" do
before(:each) do
example_group.set_description(ExampleGroup, ".behaving")
end
specify ".description should return the Type then String" do
example_group.description.should == "Spec::Example::ExampleGroup.behaving"
end
end
describe "#set_description(Type, String containing .)" do
before(:each) do
example_group.set_description(ExampleGroup, "calling a.b")
end
specify ".description should return the Type then space then String" do
example_group.description.should == "Spec::Example::ExampleGroup calling a.b"
end
end
describe "#set_description(Type, String starting with .)" do
before(:each) do
example_group.set_description(ExampleGroup, ".behaving")
end
specify "should return the Type then String" do
example_group.description.should == "Spec::Example::ExampleGroup.behaving"
end
end
describe "#set_description(Type, String containing .)" do
before(:each) do
example_group.set_description(ExampleGroup, "is #1")
end
specify ".description should return the Type then space then String" do
example_group.description.should == "Spec::Example::ExampleGroup is #1"
end
end
describe "#set_description(String, Type, String)" do
before(:each) do
example_group.set_description("A", Hash, "with one entry")
end
specify ".description should return the first String then space then Type then second String" do
example_group.description.should == "A Hash with one entry"
end
end
describe "#set_description(Hash representing options)" do
before(:each) do
example_group.set_description(:a => "b", :spec_path => "blah")
end
it ".spec_path should expand the passed in :spec_path option passed into the constructor" do
example_group.spec_path.should == File.expand_path("blah")
end
it ".description_options should return all the options passed in" do
example_group.description_options.should == {:a => "b", :spec_path => "blah"}
end
end
end
describe "#description" do
it "should return the same description instance for each call" do
example_group.description.should eql(example_group.description)
end
it "should not add a space when description_text begins with #" do
child_example_group = Class.new(example_group) do
describe("#foobar", "Does something")
end
child_example_group.description.should == "ExampleGroup#foobar Does something"
end
it "should not add a space when description_text begins with ." do
child_example_group = Class.new(example_group) do
describe(".foobar", "Does something")
end
child_example_group.description.should == "ExampleGroup.foobar Does something"
end
it "should return the class name if nil" do
example_group.set_description(nil)
example_group.description.should =~ /Class:/
end
it "should return the class name if nil" do
example_group.set_description("")
example_group.description.should =~ /Class:/
end
end
describe "#description_parts" do
it "should return an Array of the current class description args" do
example_group.description_parts.should == [example_group.description]
end
it "should return an Array of the description args from each class in the hierarchy" do
child_example_group = Class.new(example_group)
child_example_group.describe("Child", ExampleGroup)
child_example_group.description.should_not be_empty
grand_child_example_group = Class.new(child_example_group)
grand_child_example_group.describe("GrandChild", ExampleGroup)
grand_child_example_group.description.should_not be_empty
grand_child_example_group.description_parts.should == [
"ExampleGroup",
"Child",
Spec::Example::ExampleGroup,
"GrandChild",
Spec::Example::ExampleGroup
]
end
end
describe "#described_type" do
it "should return passed in type" do
child_example_group = Class.new(example_group) do
describe Object
end
child_example_group.described_type.should == Object
end
it "should return #described_type of superclass when no passed in type" do
parent_example_group = Class.new(ExampleGroup) do
describe Object, "#foobar"
end
child_example_group = Class.new(parent_example_group) do
describe "not a type"
end
child_example_group.described_type.should == Object
end
end
describe "#remove_after" do
it "should unregister a given after(:each) block" do
after_all_ran = false
@example_group.it("example") {}
proc = Proc.new { after_all_ran = true }
ExampleGroup.after(:each, &proc)
@example_group.run
after_all_ran.should be_true
after_all_ran = false
ExampleGroup.remove_after(:each, &proc)
@example_group.run
after_all_ran.should be_false
end
end
describe "#include" do
it "should have accessible class methods from included module" do
mod1_method_called = false
mod1 = Module.new do
extend Spec::MetaClass
class_methods = Module.new do
define_method :mod1_method do
mod1_method_called = true
end
end
metaclass.class_eval do
define_method(:included) do |receiver|
receiver.extend class_methods
end
end
end
mod2_method_called = false
mod2 = Module.new do
extend Spec::MetaClass
class_methods = Module.new do
define_method :mod2_method do
mod2_method_called = true
end
end
metaclass.class_eval do
define_method(:included) do |receiver|
receiver.extend class_methods
end
end
end
@example_group.include mod1, mod2
@example_group.mod1_method
@example_group.mod2_method
mod1_method_called.should be_true
mod2_method_called.should be_true
end
end
describe "#number_of_examples" do
it "should count number of specs" do
proc do
@example_group.it("one") {}
@example_group.it("two") {}
@example_group.it("three") {}
@example_group.it("four") {}
end.should change {@example_group.number_of_examples}.by(4)
end
end
describe "#class_eval" do
it "should allow constants to be defined" do
example_group = Class.new(ExampleGroup) do
describe('example')
FOO = 1
it "should reference FOO" do
FOO.should == 1
end
end
example_group.run
Object.const_defined?(:FOO).should == false
end
end
describe '#register' do
it "should add ExampleGroup to set of ExampleGroups to be run" do
options.example_groups.delete(example_group)
options.example_groups.should_not include(example_group)
example_group.register {}
options.example_groups.should include(example_group)
end
end
describe '#unregister' do
before do
options.example_groups.should include(example_group)
end
it "should remove ExampleGroup from set of ExampleGroups to be run" do
example_group.unregister
options.example_groups.should_not include(example_group)
end
end
describe "#registration_backtrace" do
it "returns the backtrace of where the ExampleGroup was registered" do
example_group = Class.new(ExampleGroup)
example_group.registration_backtrace.join("\n").should include("#{__FILE__}:#{__LINE__-1}")
end
end
describe "#run" do
it "should add_example_group if there are any examples to run" do
example_group = Class.new(ExampleGroup) do
it "should do something" do end
end
reporter.should_receive(:add_example_group)
example_group.run
end
it "should NOT add_example_group if there are no examples to run" do
example_group = Class.new(ExampleGroup) do end
reporter.should_not_receive(:add_example_group)
example_group.run
end
end
describe "#matcher_class=" do
it "should call new and matches? on the class used for matching examples" do
example_group = Class.new(ExampleGroup) do
it "should do something" do end
class << self
def specified_examples
["something"]
end
def to_s
"TestMatcher"
end
end
end
matcher = mock("matcher")
matcher.should_receive(:matches?).with(["something"]).any_number_of_times
matcher_class = Class.new
matcher_class.should_receive(:new).with("TestMatcher", "should do something").twice.and_return(matcher)
begin
ExampleGroupMethods.matcher_class = matcher_class
example_group.run
ensure
ExampleGroupMethods.matcher_class = ExampleMatcher
end
end
end
end
end
end

View file

@ -0,0 +1,723 @@
require File.dirname(__FILE__) + '/../../spec_helper'
module Spec
module Example
class ExampleModuleScopingSpec < ExampleGroup
describe ExampleGroup, "via a class definition"
module Foo
module Bar
def self.loaded?
true
end
end
end
include Foo
it "should understand module scoping" do
Bar.should be_loaded
end
@@foo = 1
it "should allow class variables to be defined" do
@@foo.should == 1
end
end
class ExampleClassVariablePollutionSpec < ExampleGroup
describe ExampleGroup, "via a class definition without a class variable"
it "should not retain class variables from other Example classes" do
proc do
@@foo
end.should raise_error
end
end
describe ExampleGroup, "#pending" do
it "should raise a Pending error when its block fails" do
block_ran = false
lambda {
pending("something") do
block_ran = true
raise "something wrong with my example"
end
}.should raise_error(Spec::Example::ExamplePendingError, "something")
block_ran.should == true
end
it "should raise Spec::Example::PendingExampleFixedError when its block does not fail" do
block_ran = false
lambda {
pending("something") do
block_ran = true
end
}.should raise_error(Spec::Example::PendingExampleFixedError, "Expected pending 'something' to fail. No Error was raised.")
block_ran.should == true
end
end
describe ExampleGroup, "#run with failure in example", :shared => true do
it "should add an example failure to the TestResult" do
example_group.run.should be_false
end
end
describe ExampleGroup, "#run" do
it_should_behave_like "sandboxed rspec_options"
attr_reader :example_group, :formatter, :reporter
before :each do
@formatter = mock("formatter", :null_object => true)
options.formatters << formatter
options.backtrace_tweaker = mock("backtrace_tweaker", :null_object => true)
@reporter = FakeReporter.new(options)
options.reporter = reporter
@example_group = Class.new(ExampleGroup) do
describe("example")
it "does nothing" do
end
end
class << example_group
public :include
end
end
after :each do
ExampleGroup.reset
end
it "should not run when there are no examples" do
example_group = Class.new(ExampleGroup) do
describe("Foobar")
end
example_group.examples.should be_empty
reporter = mock("Reporter")
reporter.should_not_receive(:add_example_group)
example_group.run
end
describe "when before_each fails" do
before(:each) do
$example_ran = $after_each_ran = false
@example_group = describe("Foobar") do
before(:each) {raise}
it "should not be run" do
$example_ran = true
end
after(:each) do
$after_each_ran = true
end
end
end
it "should not run example block" do
example_group.run
$example_ran.should be_false
end
it "should run after_each" do
example_group.run
$after_each_ran.should be_true
end
it "should report failure location when in before_each" do
reporter.should_receive(:example_finished) do |example_group, error|
error.message.should eql("in before_each")
end
example_group.run
end
end
describe ExampleGroup, "#run on dry run" do
before do
@options.dry_run = true
end
it "should not run before(:all) or after(:all)" do
before_all_ran = false
after_all_ran = false
ExampleGroup.before(:all) { before_all_ran = true }
ExampleGroup.after(:all) { after_all_ran = true }
example_group.it("should") {}
example_group.run
before_all_ran.should be_false
after_all_ran.should be_false
end
it "should not run example" do
example_ran = false
example_group.it("should") {example_ran = true}
example_group.run
example_ran.should be_false
end
end
describe ExampleGroup, "#run with specified examples" do
attr_reader :examples_that_were_run
before do
@examples_that_were_run = []
end
describe "when specified_examples matches entire ExampleGroup" do
before do
examples_that_were_run = @examples_that_were_run
@example_group = Class.new(ExampleGroup) do
describe("the ExampleGroup")
it("should be run") do
examples_that_were_run << 'should be run'
end
it("should also be run") do
examples_that_were_run << 'should also be run'
end
end
options.examples = ["the ExampleGroup"]
end
it "should not run the Examples in the ExampleGroup" do
example_group.run
examples_that_were_run.should == ['should be run', 'should also be run']
end
end
describe ExampleGroup, "#run when specified_examples matches only Example description" do
before do
examples_that_were_run = @examples_that_were_run
@example_group = Class.new(ExampleGroup) do
describe("example")
it("should be run") do
examples_that_were_run << 'should be run'
end
end
options.examples = ["should be run"]
end
it "should not run the example" do
example_group.run
examples_that_were_run.should == ['should be run']
end
end
describe ExampleGroup, "#run when specified_examples does not match an Example description" do
before do
examples_that_were_run = @examples_that_were_run
@example_group = Class.new(ExampleGroup) do
describe("example")
it("should be something else") do
examples_that_were_run << 'should be something else'
end
end
options.examples = ["does not match anything"]
end
it "should not run the example" do
example_group.run
examples_that_were_run.should == []
end
end
describe ExampleGroup, "#run when specified_examples matches an Example description" do
before do
examples_that_were_run = @examples_that_were_run
@example_group = Class.new(ExampleGroup) do
describe("example")
it("should be run") do
examples_that_were_run << 'should be run'
end
it("should not be run") do
examples_that_were_run << 'should not be run'
end
end
options.examples = ["should be run"]
end
it "should run only the example, when there in only one" do
example_group.run
examples_that_were_run.should == ["should be run"]
end
it "should run only the one example" do
example_group.run
examples_that_were_run.should == ["should be run"] end
end
end
describe ExampleGroup, "#run with success" do
before do
@special_example_group = Class.new(ExampleGroup)
ExampleGroupFactory.register(:special, @special_example_group)
@not_special_example_group = Class.new(ExampleGroup)
ExampleGroupFactory.register(:not_special, @not_special_example_group)
end
after do
ExampleGroupFactory.reset
end
it "should send reporter add_example_group" do
example_group.run
reporter.example_groups.should == [example_group]
end
it "should run example on run" do
example_ran = false
example_group.it("should") {example_ran = true}
example_group.run
example_ran.should be_true
end
it "should run before(:all) block only once" do
before_all_run_count_run_count = 0
example_group.before(:all) {before_all_run_count_run_count += 1}
example_group.it("test") {true}
example_group.it("test2") {true}
example_group.run
before_all_run_count_run_count.should == 1
end
it "should run after(:all) block only once" do
after_all_run_count = 0
example_group.after(:all) {after_all_run_count += 1}
example_group.it("test") {true}
example_group.it("test2") {true}
example_group.run
after_all_run_count.should == 1
@reporter.rspec_verify
end
it "after(:all) should have access to all instance variables defined in before(:all)" do
context_instance_value_in = "Hello there"
context_instance_value_out = ""
example_group.before(:all) { @instance_var = context_instance_value_in }
example_group.after(:all) { context_instance_value_out = @instance_var }
example_group.it("test") {true}
example_group.run
context_instance_value_in.should == context_instance_value_out
end
it "should copy instance variables from before(:all)'s execution context into spec's execution context" do
context_instance_value_in = "Hello there"
context_instance_value_out = ""
example_group.before(:all) { @instance_var = context_instance_value_in }
example_group.it("test") {context_instance_value_out = @instance_var}
example_group.run
context_instance_value_in.should == context_instance_value_out
end
it "should not add global before callbacks for untargetted example_group" do
fiddle = []
ExampleGroup.before(:all) { fiddle << "Example.before(:all)" }
ExampleGroup.prepend_before(:all) { fiddle << "Example.prepend_before(:all)" }
@special_example_group.before(:each) { fiddle << "Example.before(:each, :type => :special)" }
@special_example_group.prepend_before(:each) { fiddle << "Example.prepend_before(:each, :type => :special)" }
@special_example_group.before(:all) { fiddle << "Example.before(:all, :type => :special)" }
@special_example_group.prepend_before(:all) { fiddle << "Example.prepend_before(:all, :type => :special)" }
example_group = Class.new(ExampleGroup) do
describe("I'm not special", :type => :not_special)
it "does nothing"
end
example_group.run
fiddle.should == [
'Example.prepend_before(:all)',
'Example.before(:all)',
]
end
it "should add global before callbacks for targetted example_groups" do
fiddle = []
ExampleGroup.before(:all) { fiddle << "Example.before(:all)" }
ExampleGroup.prepend_before(:all) { fiddle << "Example.prepend_before(:all)" }
@special_example_group.before(:each) { fiddle << "special.before(:each, :type => :special)" }
@special_example_group.prepend_before(:each) { fiddle << "special.prepend_before(:each, :type => :special)" }
@special_example_group.before(:all) { fiddle << "special.before(:all, :type => :special)" }
@special_example_group.prepend_before(:all) { fiddle << "special.prepend_before(:all, :type => :special)" }
@special_example_group.append_before(:each) { fiddle << "special.append_before(:each, :type => :special)" }
example_group = Class.new(@special_example_group).describe("I'm a special example_group") {}
example_group.it("test") {true}
example_group.run
fiddle.should == [
'Example.prepend_before(:all)',
'Example.before(:all)',
'special.prepend_before(:all, :type => :special)',
'special.before(:all, :type => :special)',
'special.prepend_before(:each, :type => :special)',
'special.before(:each, :type => :special)',
'special.append_before(:each, :type => :special)',
]
end
it "should order before callbacks from global to local" do
fiddle = []
ExampleGroup.prepend_before(:all) { fiddle << "Example.prepend_before(:all)" }
ExampleGroup.before(:all) { fiddle << "Example.before(:all)" }
example_group.prepend_before(:all) { fiddle << "prepend_before(:all)" }
example_group.before(:all) { fiddle << "before(:all)" }
example_group.prepend_before(:each) { fiddle << "prepend_before(:each)" }
example_group.before(:each) { fiddle << "before(:each)" }
example_group.run
fiddle.should == [
'Example.prepend_before(:all)',
'Example.before(:all)',
'prepend_before(:all)',
'before(:all)',
'prepend_before(:each)',
'before(:each)'
]
end
it "should order after callbacks from local to global" do
fiddle = []
example_group.after(:each) { fiddle << "after(:each)" }
example_group.append_after(:each) { fiddle << "append_after(:each)" }
example_group.after(:all) { fiddle << "after(:all)" }
example_group.append_after(:all) { fiddle << "append_after(:all)" }
ExampleGroup.after(:all) { fiddle << "Example.after(:all)" }
ExampleGroup.append_after(:all) { fiddle << "Example.append_after(:all)" }
example_group.run
fiddle.should == [
'after(:each)',
'append_after(:each)',
'after(:all)',
'append_after(:all)',
'Example.after(:all)',
'Example.append_after(:all)'
]
end
it "should have accessible instance methods from included module" do
mod1_method_called = false
mod1 = Module.new do
define_method :mod1_method do
mod1_method_called = true
end
end
mod2_method_called = false
mod2 = Module.new do
define_method :mod2_method do
mod2_method_called = true
end
end
example_group.include mod1, mod2
example_group.it("test") do
mod1_method
mod2_method
end
example_group.run
mod1_method_called.should be_true
mod2_method_called.should be_true
end
it "should include targetted modules included using configuration" do
mod1 = Module.new
mod2 = Module.new
mod3 = Module.new
Spec::Runner.configuration.include(mod1, mod2)
Spec::Runner.configuration.include(mod3, :type => :not_special)
example_group = Class.new(@special_example_group).describe("I'm special", :type => :special) do
it "does nothing"
end
example_group.run
example_group.included_modules.should include(mod1)
example_group.included_modules.should include(mod2)
example_group.included_modules.should_not include(mod3)
end
it "should include any predicate_matchers included using configuration" do
$included_predicate_matcher_found = false
Spec::Runner.configuration.predicate_matchers[:do_something] = :does_something?
example_group = Class.new(ExampleGroup) do
describe('example')
it "should respond to do_something" do
$included_predicate_matcher_found = respond_to?(:do_something)
end
end
example_group.run
$included_predicate_matcher_found.should be(true)
end
it "should use a mock framework set up in config" do
mod = Module.new do
class << self
def included(mod)
$included_module = mod
end
end
def teardown_mocks_for_rspec
$torn_down = true
end
end
begin
$included_module = nil
$torn_down = true
Spec::Runner.configuration.mock_with mod
example_group = Class.new(ExampleGroup) do
describe('example')
it "does nothing"
end
example_group.run
$included_module.should_not be_nil
$torn_down.should == true
ensure
Spec::Runner.configuration.mock_with :rspec
end
end
end
describe ExampleGroup, "#run with pending example that has a failing assertion" do
before do
example_group.it("should be pending") do
pending("Example fails") {false.should be_true}
end
end
it "should send example_pending to formatter" do
@formatter.should_receive(:example_pending).with("example", "should be pending", "Example fails")
example_group.run
end
end
describe ExampleGroup, "#run with pending example that does not have a failing assertion" do
it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example"
before do
example_group.it("should be pending") do
pending("Example passes") {true.should be_true}
end
end
it "should send example_pending to formatter" do
@formatter.should_receive(:example_pending).with("example", "should be pending", "Example passes")
example_group.run
end
end
describe ExampleGroup, "#run when before(:all) fails" do
it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example"
before do
ExampleGroup.before(:all) { raise NonStandardError, "before(:all) failure" }
end
it "should not run any example" do
spec_ran = false
example_group.it("test") {spec_ran = true}
example_group.run
spec_ran.should be_false
end
it "should run ExampleGroup after(:all)" do
after_all_ran = false
ExampleGroup.after(:all) { after_all_ran = true }
example_group.run
after_all_ran.should be_true
end
it "should run example_group after(:all)" do
after_all_ran = false
example_group.after(:all) { after_all_ran = true }
example_group.run
after_all_ran.should be_true
end
it "should supply before(:all) as description" do
@reporter.should_receive(:failure) do |example, error|
example.description.should eql("before(:all)")
error.message.should eql("before(:all) failure")
end
example_group.it("test") {true}
example_group.run
end
end
describe ExampleGroup, "#run when before(:each) fails" do
it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example"
before do
ExampleGroup.before(:each) { raise NonStandardError }
end
it "should run after(:all)" do
after_all_ran = false
ExampleGroup.after(:all) { after_all_ran = true }
example_group.run
after_all_ran.should be_true
end
end
describe ExampleGroup, "#run when any example fails" do
it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example"
before do
example_group.it("should") { raise NonStandardError }
end
it "should run after(:all)" do
after_all_ran = false
ExampleGroup.after(:all) { after_all_ran = true }
example_group.run
after_all_ran.should be_true
end
end
describe ExampleGroup, "#run when first after(:each) block fails" do
it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example"
before do
class << example_group
attr_accessor :first_after_ran, :second_after_ran
end
example_group.first_after_ran = false
example_group.second_after_ran = false
example_group.after(:each) do
self.class.second_after_ran = true
end
example_group.after(:each) do
self.class.first_after_ran = true
raise "first"
end
end
it "should run second after(:each) block" do
reporter.should_receive(:example_finished) do |example, error|
example.should equal(example)
error.message.should eql("first")
end
example_group.run
example_group.first_after_ran.should be_true
example_group.second_after_ran.should be_true
end
end
describe ExampleGroup, "#run when first before(:each) block fails" do
it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example"
before do
class << example_group
attr_accessor :first_before_ran, :second_before_ran
end
example_group.first_before_ran = false
example_group.second_before_ran = false
example_group.before(:each) do
self.class.first_before_ran = true
raise "first"
end
example_group.before(:each) do
self.class.second_before_ran = true
end
end
it "should not run second before(:each)" do
reporter.should_receive(:example_finished) do |name, error|
error.message.should eql("first")
end
example_group.run
example_group.first_before_ran.should be_true
example_group.second_before_ran.should be_false
end
end
describe ExampleGroup, "#run when failure in after(:all)" do
it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example"
before do
ExampleGroup.after(:all) { raise NonStandardError, "in after(:all)" }
end
it "should return false" do
example_group.run.should be_false
end
end
end
class ExampleSubclass < ExampleGroup
end
describe ExampleGroup, "subclasses" do
after do
ExampleGroupFactory.reset
end
it "should have access to the described_type" do
example_group = Class.new(ExampleSubclass) do
describe(Array)
end
example_group.send(:described_type).should == Array
end
it "should concat descriptions when nested" do
example_group = Class.new(ExampleSubclass) do
describe(Array)
$nested_group = describe("when empty") do
end
end
$nested_group.description.to_s.should == "Array when empty"
end
end
describe Enumerable do
before(:each) do
Kernel.stub!(:warn)
end
def each(&block)
["4", "2", "1"].each(&block)
end
it "should be included in examples because it is a module" do
map{|e| e.to_i}.should == [4,2,1]
end
end
describe "An", Enumerable, "as a second argument" do
before(:each) do
Kernel.stub!(:warn)
end
def each(&block)
["4", "2", "1"].each(&block)
end
it "should be included in examples because it is a module" do
map{|e| e.to_i}.should == [4,2,1]
end
end
describe Enumerable do
describe "as the parent of nested example groups" do
before(:each) do
Kernel.stub!(:warn)
end
it "should be included in examples because it is a module" do
pending("need to make sure nested groups know the described type") do
map{|e| e.to_i}.should == [4,2,1]
end
end
end
end
describe String do
it "should not be included in examples because it is not a module" do
lambda{self.map}.should raise_error(NoMethodError, /undefined method `map' for/)
end
end
end
end

View file

@ -0,0 +1,96 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Example
module ExampleMatcherSpecHelper
class MatchDescription
def initialize(description)
@description = description
end
def matches?(matcher)
matcher.matches?(@description)
end
def failure_message
"expected matcher.matches?(#{@description.inspect}) to return true, got false"
end
def negative_failure_message
"expected matcher.matches?(#{@description.inspect}) to return false, got true"
end
end
def match_description(description)
MatchDescription.new(description)
end
end
describe ExampleMatcher, "#matches?" do
include ExampleMatcherSpecHelper
it "should match correct example_group and example" do
matcher = ExampleMatcher.new("example_group", "example")
matcher.should match_description("example_group example")
end
it "should not match wrong example" do
matcher = ExampleMatcher.new("example_group", "other example")
matcher.should_not match_description("example_group example")
end
it "should not match wrong example_group" do
matcher = ExampleMatcher.new("other example_group", "example")
matcher.should_not match_description("example_group example")
end
it "should match example only" do
matcher = ExampleMatcher.new("example_group", "example")
matcher.should match_description("example")
end
it "should match example_group only" do
matcher = ExampleMatcher.new("example_group", "example")
matcher.should match_description("example_group")
end
it "should match example_group ending with before(:all)" do
matcher = ExampleMatcher.new("example_group", "example")
matcher.should match_description("example_group before(:all)")
end
it "should escape regexp chars" do
matcher = ExampleMatcher.new("(con|text)", "[example]")
matcher.should_not match_description("con p")
end
it "should match when example_group is modularized" do
matcher = ExampleMatcher.new("MyModule::MyClass", "example")
matcher.should match_description("MyClass example")
end
end
describe ExampleMatcher, "#matches? normal case" do
it "matches when passed in example matches" do
matcher = ExampleMatcher.new("Foo", "bar")
matcher.matches?(["no match", "Foo bar"]).should == true
end
it "does not match when no passed in examples match" do
matcher = ExampleMatcher.new("Foo", "bar")
matcher.matches?(["no match1", "no match2"]).should == false
end
end
describe ExampleMatcher, "#matches? where description has '::' in it" do
it "matches when passed in example matches" do
matcher = ExampleMatcher.new("Foo::Bar", "baz")
matcher.matches?(["no match", "Foo::Bar baz"]).should == true
end
it "does not match when no passed in examples match" do
matcher = ExampleMatcher.new("Foo::Bar", "baz")
matcher.matches?(["no match1", "no match2"]).should == false
end
end
end
end

View file

@ -0,0 +1,126 @@
require File.dirname(__FILE__) + '/../../spec_helper'
module Spec
module Example
module ModuleThatIsReopened
end
module ExampleMethods
include ModuleThatIsReopened
end
module ModuleThatIsReopened
def module_that_is_reopened_method
end
end
describe ExampleMethods do
describe "with an included module that is reopened" do
it "should have repoened methods" do
method(:module_that_is_reopened_method).should_not be_nil
end
end
describe "lifecycle" do
before do
@original_rspec_options = $rspec_options
@options = ::Spec::Runner::Options.new(StringIO.new, StringIO.new)
$rspec_options = @options
@options.formatters << mock("formatter", :null_object => true)
@options.backtrace_tweaker = mock("backtrace_tweaker", :null_object => true)
@reporter = FakeReporter.new(@options)
@options.reporter = @reporter
ExampleMethods.before_all_parts.should == []
ExampleMethods.before_each_parts.should == []
ExampleMethods.after_each_parts.should == []
ExampleMethods.after_all_parts.should == []
def ExampleMethods.count
@count ||= 0
@count = @count + 1
@count
end
end
after do
$rspec_options = @original_rspec_options
ExampleMethods.instance_variable_set("@before_all_parts", [])
ExampleMethods.instance_variable_set("@before_each_parts", [])
ExampleMethods.instance_variable_set("@after_each_parts", [])
ExampleMethods.instance_variable_set("@after_all_parts", [])
end
it "should pass before and after callbacks to all ExampleGroup subclasses" do
ExampleMethods.before(:suite) do
ExampleMethods.count.should == 1
end
ExampleMethods.before(:all) do
ExampleMethods.count.should == 2
end
ExampleMethods.before(:each) do
ExampleMethods.count.should == 3
end
ExampleMethods.after(:each) do
ExampleMethods.count.should == 4
end
ExampleMethods.after(:all) do
ExampleMethods.count.should == 5
end
ExampleMethods.after(:suite) do
ExampleMethods.count.should == 6
end
@example_group = Class.new(ExampleGroup) do
it "should use ExampleMethods callbacks" do
end
end
@options.run_examples
ExampleMethods.count.should == 7
end
describe "run_with_description_capturing" do
before(:each) do
@example_group = Class.new(ExampleGroup) do end
@example = @example_group.new("foo", &(lambda { 2.should == 2 }))
@example.run_with_description_capturing
end
it "should provide the generated description" do
@example.instance_eval { @_matcher_description }.should == "should == 2"
end
it "should clear the global generated_description" do
Spec::Matchers.generated_description.should == nil
end
end
end
describe "#implementation_backtrace" do
it "returns the backtrace of where the implementation was defined" do
example_group = Class.new(ExampleGroup) do
it "should use ExampleMethods callbacks" do
end
end
example = example_group.examples.first
example.implementation_backtrace.join("\n").should include("#{__FILE__}:#{__LINE__-4}")
end
end
describe "#__full_description" do
it "should return the full description of the ExampleGroup and Example" do
example_group = Class.new(ExampleGroup).describe("An ExampleGroup") do
it "should do something" do
end
end
example = example_group.examples.first
example.__full_description.should == "An ExampleGroup should do something"
end
end
end
end
end

View file

@ -0,0 +1,194 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Example
# describe "Spec::Example::ExampleRunner", "#run", :shared => true do
# before(:each) do
# @options = ::Spec::Runner::Options.new(StringIO.new, StringIO.new)
# @reporter = ::Spec::Runner::Reporter.new(@options)
# @options.reporter = @reporter
# @example_group_class = Class.new(ExampleGroup) do
# plugin_mock_framework
# describe("Some Examples")
# end
# end
#
# def create_runner(example_definition)
# example = @example_group_class.new(example_definition)
# runner = ExampleGroup.new(@options, example)
# runner.stub!(:verify_mocks)
# runner.stub!(:teardown_mocks)
# runner
# end
# end
#
# describe ExampleRunner, "#run with blank passing example" do
# it_should_behave_like "Spec::Example::ExampleRunner#run"
#
# before do
# @e = @example_group_class.it("example") {}
# @runner = create_runner(@e)
# end
#
# it "should send reporter example_started" do
# @reporter.should_receive(:example_started).with(equal(@e))
# @runner.run
# end
#
# it "should report its name for dry run" do
# @options.dry_run = true
# @reporter.should_receive(:example_finished).with(equal(@e), nil)
# @runner.run
# end
#
# it "should report success" do
# @reporter.should_receive(:example_finished).with(equal(@e), nil)
# @runner.run
# end
# end
#
# describe ExampleRunner, "#run with a failing example" do
# predicate_matchers[:is_a] = [:is_a?]
# it_should_behave_like "Spec::Example::ExampleRunner#run"
#
# before do
# @e = @example_group_class.it("example") do
# (2+2).should == 5
# end
# @runner = create_runner(@e)
# end
#
# it "should report failure due to failure" do
# @reporter.should_receive(:example_finished).with(
# equal(@e),
# is_a(Spec::Expectations::ExpectationNotMetError)
# )
# @runner.run
# end
# end
#
# describe ExampleRunner, "#run with a erroring example" do
# it_should_behave_like "Spec::Example::ExampleRunner#run"
#
# before do
# @error = error = NonStandardError.new("in body")
# @example_definition = @example_group_class.it("example") do
# raise(error)
# end
# @runner = create_runner(@example_definition)
# end
#
# it "should report failure due to error" do
# @reporter.should_receive(:example_finished).with(
# equal(@example_definition),
# @error
# )
# @runner.run
# end
#
# it "should run after_each block" do
# @example_group_class.after(:each) do
# raise("in after_each")
# end
# @reporter.should_receive(:example_finished) do |example_definition, error|
# example_definition.should equal(@example_definition)
# error.message.should eql("in body")
# end
# @runner.run
# end
# end
#
# describe ExampleRunner, "#run where after_each fails" do
# it_should_behave_like "Spec::Example::ExampleRunner#run"
#
# before do
# @example_ran = example_ran = false
# @example_definition = @example_group_class.it("should not run") do
# example_ran = true
# end
# @runner = create_runner(@example_definition)
# @example_group_class.after(:each) { raise(NonStandardError.new("in after_each")) }
# end
#
# it "should report failure location when in after_each" do
# @reporter.should_receive(:example_finished) do |example_definition, error|
# example_definition.should equal(@example_definition)
# error.message.should eql("in after_each")
# end
# @runner.run
# end
# end
#
# describe ExampleRunner, "#run with use cases" do
# predicate_matchers[:is_a] = [:is_a?]
# it_should_behave_like "Spec::Example::ExampleRunner#run"
#
# it "should report NO NAME when told to use generated description with --dry-run" do
# @options.dry_run = true
# example_definition = @example_group_class.it() do
# 5.should == 5
# end
# runner = create_runner(example_definition)
#
# @reporter.should_receive(:example_finished) do |example_definition, error|
# example_definition.description.should == "NO NAME (Because of --dry-run)"
# end
# runner.run
# end
#
# it "should report given name if present with --dry-run" do
# @options.dry_run = true
# example_definition = @example_group_class.it("example name") do
# 5.should == 5
# end
# runner = create_runner(example_definition)
#
# @reporter.should_receive(:example_finished) do |example_definition, error|
# example_definition.description.should == "example name"
# end
# runner.run
# end
#
# it "should report NO NAME when told to use generated description with no expectations" do
# example_definition = @example_group_class.it() {}
# runner = create_runner(example_definition)
# @reporter.should_receive(:example_finished) do |example, error|
# example.description.should == "NO NAME (Because there were no expectations)"
# end
# runner.run
# end
#
# it "should report NO NAME when told to use generated description and matcher fails" do
# example_definition = @example_group_class.it() do
# 5.should "" # Has no matches? method..
# end
# runner = create_runner(example_definition)
#
# @reporter.should_receive(:example_finished) do |example, error|
# example_definition.description.should == "NO NAME (Because of Error raised in matcher)"
# end
# runner.run
# end
#
# it "should report generated description when told to and it is available" do
# example_definition = @example_group_class.it() {
# 5.should == 5
# }
# runner = create_runner(example_definition)
#
# @reporter.should_receive(:example_finished) do |example_definition, error|
# example_definition.description.should == "should == 5"
# end
# runner.run
# end
#
# it "should unregister description_generated callback (lest a memory leak should build up)" do
# example_definition = @example_group_class.it("something")
# runner = create_runner(example_definition)
#
# Spec::Matchers.should_receive(:example_finished)
# runner.run
# end
# end
end
end

View file

@ -0,0 +1,53 @@
require File.dirname(__FILE__) + '/../../spec_helper'
module Spec
module Example
# describe Example do
# before(:each) do
# @example = Example.new "example" do
# foo
# end
# end
#
# it "should tell you its docstring" do
# @example.description.should == "example"
# end
#
# it "should execute its block in the context provided" do
# context = Class.new do
# def foo
# "foo"
# end
# end.new
# @example.run_in(context).should == "foo"
# end
# end
#
# describe Example, "#description" do
# it "should default to NO NAME when not passed anything when there are no matchers" do
# example = Example.new {}
# example.run_in(Object.new)
# example.description.should == "NO NAME"
# end
#
# it "should default to NO NAME description (Because of --dry-run) when passed nil and there are no matchers" do
# example = Example.new(nil) {}
# example.run_in(Object.new)
# example.description.should == "NO NAME"
# end
#
# it "should allow description to be overridden" do
# example = Example.new("Test description")
# example.description.should == "Test description"
# end
#
# it "should use description generated from matcher when there is no passed in description" do
# example = Example.new(nil) do
# 1.should == 1
# end
# example.run_in(Object.new)
# example.description.should == "should == 1"
# end
# end
end
end

View file

@ -0,0 +1,71 @@
require File.dirname(__FILE__) + '/../../spec_helper'
module Spec
module Example
describe 'Nested Example Groups' do
parent = self
def count
@count ||= 0
@count = @count + 1
@count
end
before(:all) do
count.should == 1
end
before(:all) do
count.should == 2
end
before(:each) do
count.should == 3
end
before(:each) do
count.should == 4
end
it "should run before(:all), before(:each), example, after(:each), after(:all) in order" do
count.should == 5
end
after(:each) do
count.should == 7
end
after(:each) do
count.should == 6
end
after(:all) do
count.should == 9
end
after(:all) do
count.should == 8
end
describe 'nested example group' do
self.superclass.should == parent
it "should run all before and after callbacks" do
count.should == 5
end
end
end
describe "Nested Example Groups" do
describe "description options", :other_options => "other options" do
it "should have a spec_path" do
self.class.description_options[:spec_path].should match(/#{__FILE__}/)
end
it "should pass other options" do
self.class.description_options[:other_options].should == "other options"
end
end
end
end
end

View file

@ -0,0 +1,31 @@
module Spec
module Example
describe Pending do
it 'should raise an ExamplePendingError if no block is supplied' do
lambda {
include Pending
pending "TODO"
}.should raise_error(ExamplePendingError, /TODO/)
end
it 'should raise an ExamplePendingError if a supplied block fails as expected' do
lambda {
include Pending
pending "TODO" do
raise "oops"
end
}.should raise_error(ExamplePendingError, /TODO/)
end
it 'should raise a PendingExampleFixedError if a supplied block starts working' do
lambda {
include Pending
pending "TODO" do
# success!
end
}.should raise_error(PendingExampleFixedError, /TODO/)
end
end
end
end

View file

@ -0,0 +1,21 @@
require File.dirname(__FILE__) + '/../../spec_helper'
module Spec
module Example
class Fish
def can_swim?(distance_in_yards)
distance_in_yards < 1000
end
end
describe "predicate_matcher[method_on_object] = matcher_method" do
predicate_matchers[:swim] = :can_swim?
it "should match matcher_method if method_on_object returns true" do
swim(100).matches?(Fish.new).should be_true
end
it "should not match matcher_method if method_on_object returns false" do
swim(10000).matches?(Fish.new).should be_false
end
end
end
end

View file

@ -0,0 +1,265 @@
require File.dirname(__FILE__) + '/../../spec_helper'
module Spec
module Example
describe ExampleGroup, "with :shared => true" do
it_should_behave_like "sandboxed rspec_options"
attr_reader :formatter, :example_group
before(:each) do
@formatter = Spec::Mocks::Mock.new("formatter", :null_object => true)
options.formatters << formatter
@example_group = Class.new(ExampleGroup).describe("example_group")
class << example_group
public :include
end
end
after(:each) do
@formatter.rspec_verify
@example_group = nil
$shared_example_groups.clear unless $shared_example_groups.nil?
end
def make_shared_example_group(name, opts=nil, &block)
example_group = SharedExampleGroup.new(name, :shared => true, &block)
SharedExampleGroup.add_shared_example_group(example_group)
example_group
end
def non_shared_example_group()
@non_shared_example_group ||= Class.new(ExampleGroup).describe("example_group")
end
it "should accept an optional options hash" do
lambda { Class.new(ExampleGroup).describe("context") }.should_not raise_error(Exception)
lambda { Class.new(ExampleGroup).describe("context", :shared => true) }.should_not raise_error(Exception)
end
it "should return all shared example_groups" do
b1 = make_shared_example_group("b1", :shared => true) {}
b2 = make_shared_example_group("b2", :shared => true) {}
b1.should_not be(nil)
b2.should_not be(nil)
SharedExampleGroup.find_shared_example_group("b1").should equal(b1)
SharedExampleGroup.find_shared_example_group("b2").should equal(b2)
end
it "should register as shared example_group" do
example_group = make_shared_example_group("example_group") {}
SharedExampleGroup.shared_example_groups.should include(example_group)
end
it "should not be shared when not configured as shared" do
example_group = non_shared_example_group
SharedExampleGroup.shared_example_groups.should_not include(example_group)
end
it "should complain when adding a second shared example_group with the same description" do
describe "shared example_group", :shared => true do
end
lambda do
describe "shared example_group", :shared => true do
end
end.should raise_error(ArgumentError)
end
it "should NOT complain when adding the same shared example_group instance again" do
shared_example_group = Class.new(ExampleGroup).describe("shared example_group", :shared => true)
SharedExampleGroup.add_shared_example_group(shared_example_group)
SharedExampleGroup.add_shared_example_group(shared_example_group)
end
it "should NOT complain when adding the same shared example_group again (i.e. file gets reloaded)" do
lambda do
2.times do
describe "shared example_group which gets loaded twice", :shared => true do
end
end
end.should_not raise_error(ArgumentError)
end
it "should NOT complain when adding the same shared example_group in same file with different absolute path" do
shared_example_group_1 = Class.new(ExampleGroup).describe(
"shared example_group",
:shared => true,
:spec_path => "/my/spec/a/../shared.rb"
)
shared_example_group_2 = Class.new(ExampleGroup).describe(
"shared example_group",
:shared => true,
:spec_path => "/my/spec/b/../shared.rb"
)
SharedExampleGroup.add_shared_example_group(shared_example_group_1)
SharedExampleGroup.add_shared_example_group(shared_example_group_2)
end
it "should complain when adding a different shared example_group with the same name in a different file with the same basename" do
shared_example_group_1 = Class.new(ExampleGroup).describe(
"shared example_group",
:shared => true,
:spec_path => "/my/spec/a/shared.rb"
)
shared_example_group_2 = Class.new(ExampleGroup).describe(
"shared example_group",
:shared => true,
:spec_path => "/my/spec/b/shared.rb"
)
SharedExampleGroup.add_shared_example_group(shared_example_group_1)
lambda do
SharedExampleGroup.add_shared_example_group(shared_example_group_2)
end.should raise_error(ArgumentError, /already exists/)
end
it "should add examples to current example_group using it_should_behave_like" do
shared_example_group = make_shared_example_group("shared example_group") do
it("shared example") {}
it("shared example 2") {}
end
example_group.it("example") {}
example_group.number_of_examples.should == 1
example_group.it_should_behave_like("shared example_group")
example_group.number_of_examples.should == 3
end
it "should add examples to current example_group using include" do
shared_example_group = describe "all things", :shared => true do
it "should do stuff" do end
end
example_group = describe "one thing" do
include shared_example_group
end
example_group.number_of_examples.should == 1
end
it "should add examples to current example_group using it_should_behave_like with a module" do
AllThings = describe "all things", :shared => true do
it "should do stuff" do end
end
example_group = describe "one thing" do
it_should_behave_like AllThings
end
example_group.number_of_examples.should == 1
end
it "should run shared examples" do
shared_example_ran = false
shared_example_group = make_shared_example_group("shared example_group") do
it("shared example") { shared_example_ran = true }
end
example_ran = false
example_group.it_should_behave_like("shared example_group")
example_group.it("example") {example_ran = true}
example_group.run
example_ran.should be_true
shared_example_ran.should be_true
end
it "should run setup and teardown from shared example_group" do
shared_setup_ran = false
shared_teardown_ran = false
shared_example_group = make_shared_example_group("shared example_group") do
before { shared_setup_ran = true }
after { shared_teardown_ran = true }
it("shared example") { shared_example_ran = true }
end
example_ran = false
example_group.it_should_behave_like("shared example_group")
example_group.it("example") {example_ran = true}
example_group.run
example_ran.should be_true
shared_setup_ran.should be_true
shared_teardown_ran.should be_true
end
it "should run before(:all) and after(:all) only once from shared example_group" do
shared_before_all_run_count = 0
shared_after_all_run_count = 0
shared_example_group = make_shared_example_group("shared example_group") do
before(:all) { shared_before_all_run_count += 1}
after(:all) { shared_after_all_run_count += 1}
it("shared example") { shared_example_ran = true }
end
example_ran = false
example_group.it_should_behave_like("shared example_group")
example_group.it("example") {example_ran = true}
example_group.run
example_ran.should be_true
shared_before_all_run_count.should == 1
shared_after_all_run_count.should == 1
end
it "should include modules, included into shared example_group, into current example_group" do
@formatter.should_receive(:add_example_group).with(any_args)
shared_example_group = make_shared_example_group("shared example_group") do
it("shared example") { shared_example_ran = true }
end
mod1_method_called = false
mod1 = Module.new do
define_method :mod1_method do
mod1_method_called = true
end
end
mod2_method_called = false
mod2 = Module.new do
define_method :mod2_method do
mod2_method_called = true
end
end
shared_example_group.include mod2
example_group.it_should_behave_like("shared example_group")
example_group.include mod1
example_group.it("test") do
mod1_method
mod2_method
end
example_group.run
mod1_method_called.should be_true
mod2_method_called.should be_true
end
it "should make methods defined in the shared example_group available in consuming example_group" do
shared_example_group = make_shared_example_group("shared example_group xyz") do
def a_shared_helper_method
"this got defined in a shared example_group"
end
end
example_group.it_should_behave_like("shared example_group xyz")
success = false
example_group.it("should access a_shared_helper_method") do
a_shared_helper_method
success = true
end
example_group.run
success.should be_true
end
it "should raise when named shared example_group can not be found" do
lambda {
example_group.it_should_behave_like("non-existent shared example group")
violated
}.should raise_error("Shared Example Group 'non-existent shared example group' can not be found")
end
end
end
end

View file

@ -0,0 +1,25 @@
require File.dirname(__FILE__) + '/../../spec_helper'
module Spec
module Example
class GrandParentExampleGroup < Spec::Example::ExampleGroup
describe "Grandparent ExampleGroup"
end
class ParentExampleGroup < GrandParentExampleGroup
describe "Parent ExampleGroup"
it "should bar" do
end
end
class ChildExampleGroup < ParentExampleGroup
describe "Child ExampleGroup"
it "should bam" do
end
end
describe ChildExampleGroup do
end
end
end

View file

@ -0,0 +1,127 @@
require File.dirname(__FILE__) + '/../../../spec_helper.rb'
module Spec
module Fixtures
class Animal
def initialize(name,species)
@name,@species = name,species
end
def inspect
<<-EOA
<Animal
name=#{@name},
species=#{@species}
>
EOA
end
end
end
end
describe "Diff" do
before(:each) do
@options = ::Spec::Runner::Options.new(StringIO.new, StringIO.new)
@differ = Spec::Expectations::Differs::Default.new(@options)
end
it "should output unified diff of two strings" do
expected="foo\nbar\nzap\nthis\nis\nsoo\nvery\nvery\nequal\ninsert\na\nline\n"
actual="foo\nzap\nbar\nthis\nis\nsoo\nvery\nvery\nequal\ninsert\na\nanother\nline\n"
expected_diff= <<'EOD'
@@ -1,6 +1,6 @@
foo
-zap
bar
+zap
this
is
soo
@@ -9,6 +9,5 @@
equal
insert
a
-another
line
EOD
diff = @differ.diff_as_string(expected, actual)
diff.should eql(expected_diff)
end
it "should output unified diff message of two arrays" do
expected = [ :foo, 'bar', :baz, 'quux', :metasyntactic, 'variable', :delta, 'charlie', :width, 'quite wide' ]
actual = [ :foo, 'bar', :baz, 'quux', :metasyntactic, 'variable', :delta, 'tango' , :width, 'very wide' ]
expected_diff = <<'EOD'
@@ -5,7 +5,7 @@
:metasyntactic,
"variable",
:delta,
- "tango",
+ "charlie",
:width,
- "very wide"]
+ "quite wide"]
EOD
diff = @differ.diff_as_object(expected,actual)
diff.should == expected_diff
end
it "should output unified diff message of two objects" do
expected = Spec::Fixtures::Animal.new "bob", "giraffe"
actual = Spec::Fixtures::Animal.new "bob", "tortoise"
expected_diff = <<'EOD'
@@ -1,5 +1,5 @@
<Animal
name=bob,
- species=tortoise
+ species=giraffe
>
EOD
diff = @differ.diff_as_object(expected,actual)
diff.should == expected_diff
end
end
describe "Diff in context format" do
before(:each) do
@options = Spec::Runner::Options.new(StringIO.new, StringIO.new)
@options.diff_format = :context
@differ = Spec::Expectations::Differs::Default.new(@options)
end
it "should output unified diff message of two objects" do
expected = Spec::Fixtures::Animal.new "bob", "giraffe"
actual = Spec::Fixtures::Animal.new "bob", "tortoise"
expected_diff = <<'EOD'
***************
*** 1,5 ****
<Animal
name=bob,
! species=tortoise
>
--- 1,5 ----
<Animal
name=bob,
! species=giraffe
>
EOD
diff = @differ.diff_as_object(expected,actual)
diff.should == expected_diff
end
end

View file

@ -0,0 +1,107 @@
require File.dirname(__FILE__) + '/../../../spec_helper.rb'
describe Object, "#should" do
before(:each) do
@target = "target"
@matcher = mock("matcher")
@matcher.stub!(:matches?).and_return(true)
@matcher.stub!(:failure_message)
end
it "should accept and interact with a matcher" do
@matcher.should_receive(:matches?).with(@target).and_return(true)
@target.should @matcher
end
it "should ask for a failure_message when matches? returns false" do
@matcher.should_receive(:matches?).with(@target).and_return(false)
@matcher.should_receive(:failure_message).and_return("the failure message")
lambda {
@target.should @matcher
}.should fail_with("the failure message")
end
it "should raise error if it receives false directly" do
lambda {
@target.should false
}.should raise_error(Spec::Expectations::InvalidMatcherError)
end
it "should raise error if it receives false (evaluated)" do
lambda {
@target.should eql?("foo")
}.should raise_error(Spec::Expectations::InvalidMatcherError)
end
it "should raise error if it receives true" do
lambda {
@target.should true
}.should raise_error(Spec::Expectations::InvalidMatcherError)
end
it "should raise error if it receives nil" do
lambda {
@target.should nil
}.should raise_error(Spec::Expectations::InvalidMatcherError)
end
it "should raise error if it receives no argument and it is not used as a left side of an operator" do
pending "Is it even possible to catch this?"
lambda {
@target.should
}.should raise_error(Spec::Expectations::InvalidMatcherError)
end
end
describe Object, "#should_not" do
before(:each) do
@target = "target"
@matcher = mock("matcher")
end
it "should accept and interact with a matcher" do
@matcher.should_receive(:matches?).with(@target).and_return(false)
@matcher.stub!(:negative_failure_message)
@target.should_not @matcher
end
it "should ask for a negative_failure_message when matches? returns true" do
@matcher.should_receive(:matches?).with(@target).and_return(true)
@matcher.should_receive(:negative_failure_message).and_return("the negative failure message")
lambda {
@target.should_not @matcher
}.should fail_with("the negative failure message")
end
it "should raise error if it receives false directly" do
lambda {
@target.should_not false
}.should raise_error(Spec::Expectations::InvalidMatcherError)
end
it "should raise error if it receives false (evaluated)" do
lambda {
@target.should_not eql?("foo")
}.should raise_error(Spec::Expectations::InvalidMatcherError)
end
it "should raise error if it receives true" do
lambda {
@target.should_not true
}.should raise_error(Spec::Expectations::InvalidMatcherError)
end
it "should raise error if it receives nil" do
lambda {
@target.should_not nil
}.should raise_error(Spec::Expectations::InvalidMatcherError)
end
it "should raise error if it receives no argument and it is not used as a left side of an operator" do
pending "Is it even possible to catch this?"
lambda {
@target.should_not
}.should raise_error(Spec::Expectations::InvalidMatcherError)
end
end

View file

@ -0,0 +1,71 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
describe Spec::Expectations, "#fail_with with no diff" do
before(:each) do
@old_differ = Spec::Expectations.differ
Spec::Expectations.differ = nil
end
it "should handle just a message" do
lambda {
Spec::Expectations.fail_with "the message"
}.should fail_with("the message")
end
it "should handle an Array" do
lambda {
Spec::Expectations.fail_with ["the message","expected","actual"]
}.should fail_with("the message")
end
after(:each) do
Spec::Expectations.differ = @old_differ
end
end
describe Spec::Expectations, "#fail_with with diff" do
before(:each) do
@old_differ = Spec::Expectations.differ
@differ = mock("differ")
Spec::Expectations.differ = @differ
end
it "should not call differ if no expected/actual" do
lambda {
Spec::Expectations.fail_with "the message"
}.should fail_with("the message")
end
it "should call differ if expected/actual are presented separately" do
@differ.should_receive(:diff_as_string).and_return("diff")
lambda {
Spec::Expectations.fail_with "the message", "expected", "actual"
}.should fail_with("the message\nDiff:diff")
end
it "should call differ if expected/actual are not strings" do
@differ.should_receive(:diff_as_object).and_return("diff")
lambda {
Spec::Expectations.fail_with "the message", :expected, :actual
}.should fail_with("the message\nDiff:diff")
end
it "should not call differ if expected or actual are procs" do
@differ.should_not_receive(:diff_as_string)
@differ.should_not_receive(:diff_as_object)
lambda {
Spec::Expectations.fail_with "the message", lambda {}, lambda {}
}.should fail_with("the message")
end
it "should call differ if expected/actual are presented in an Array with message" do
@differ.should_receive(:diff_as_string).with("actual","expected").and_return("diff")
lambda {
Spec::Expectations.fail_with(["the message", "expected", "actual"])
}.should fail_with(/the message\nDiff:diff/)
end
after(:each) do
Spec::Expectations.differ = @old_differ
end
end

View file

@ -0,0 +1,76 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Extensions
describe Main do
it_should_behave_like "sandboxed rspec_options"
before(:each) do
@main = Class.new do; include Main; end
end
after(:each) do
$rspec_story_steps = @original_rspec_story_steps
end
it "should create an Options object" do
@main.send(:rspec_options).should be_instance_of(Spec::Runner::Options)
@main.send(:rspec_options).should === $rspec_options
end
specify {@main.should respond_to(:describe)}
specify {@main.should respond_to(:context)}
it "should raise when no block given to describe" do
lambda { @main.describe "foo" }.should raise_error(ArgumentError)
end
it "should raise when no description given to describe" do
lambda { @main.describe do; end }.should raise_error(ArgumentError)
end
it "should registered ExampleGroups by default" do
example_group = @main.describe("The ExampleGroup") do end
rspec_options.example_groups.should include(example_group)
end
it "should not run unregistered ExampleGroups" do
example_group = @main.describe("The ExampleGroup") do
unregister
end
rspec_options.example_groups.should_not include(example_group)
end
it "should create a shared ExampleGroup with share_examples_for" do
group = @main.share_examples_for "all things" do end
group.should be_an_instance_of(Spec::Example::SharedExampleGroup)
end
describe "#share_as" do
before(:each) do
$share_as_examples_example_module_number ||= 1
$share_as_examples_example_module_number += 1
t = Time.new.to_i
@group_name = "Group#{$share_as_examples_example_module_number}"
end
it "should create a shared ExampleGroup" do
group = @main.share_as @group_name do end
group.should be_an_instance_of(Spec::Example::SharedExampleGroup)
end
it "should create a constant that points to a Module" do
group = @main.share_as @group_name do end
Object.const_get(@group_name).should equal(group)
end
it "should bark if you pass it something not-constantizable" do
lambda do
@group = @main.share_as "Non Constant" do end
end.should raise_error(NameError, /The first argument to share_as must be a legal name for a constant/)
end
end
end
end
end

View file

@ -0,0 +1,10 @@
rspec_lib = File.dirname(__FILE__) + "/../../../../../../lib"
$:.unshift rspec_lib unless $:.include?(rspec_lib)
require 'test/unit'
require 'spec'
describe "example group with failures" do
it "should fail" do
false.should be_true
end
end

View file

@ -0,0 +1,10 @@
rspec_lib = File.dirname(__FILE__) + "/../../../../../../lib"
$:.unshift rspec_lib unless $:.include?(rspec_lib)
require 'test/unit'
require 'spec'
describe "example group with passing examples" do
it "should pass" do
true.should be_true
end
end

View file

@ -0,0 +1,10 @@
rspec_lib = File.dirname(__FILE__) + "/../../../../../../lib"
$:.unshift rspec_lib unless $:.include?(rspec_lib)
require 'test/unit'
require 'spec'
describe "example group with errors" do
it "should raise errors" do
raise "error raised in example group with errors"
end
end

View file

@ -0,0 +1,10 @@
rspec_lib = File.dirname(__FILE__) + "/../../../../../../lib"
$:.unshift rspec_lib unless $:.include?(rspec_lib)
require 'test/unit'
require 'spec'
class TestCaseThatFails < Test::Unit::TestCase
def test_that_fails
false.should be_true
end
end

View file

@ -0,0 +1,10 @@
rspec_lib = File.dirname(__FILE__) + "/../../../../../../lib"
$:.unshift rspec_lib unless $:.include?(rspec_lib)
require 'test/unit'
require 'spec'
class TestCaseThatPasses < Test::Unit::TestCase
def test_that_passes
true.should be_true
end
end

View file

@ -0,0 +1,10 @@
rspec_lib = File.dirname(__FILE__) + "/../../../../../../lib"
$:.unshift rspec_lib unless $:.include?(rspec_lib)
require 'test/unit'
require 'spec'
class TestCaseWithErrors < Test::Unit::TestCase
def test_with_error
raise "error raised in TestCaseWithErrors"
end
end

View file

@ -0,0 +1,38 @@
rspec_lib = File.dirname(__FILE__) + "/../../../../../../lib"
$:.unshift rspec_lib unless $:.include?(rspec_lib)
require "test/unit"
require "spec"
module Test
module Unit
describe TestSuiteAdapter do
def create_adapter(group)
TestSuiteAdapter.new(group)
end
describe "#size" do
it "should return the number of examples in the example group" do
group = Class.new(Spec::ExampleGroup) do
describe("some examples")
it("bar") {}
it("baz") {}
end
adapter = create_adapter(group)
adapter.size.should == 2
end
end
describe "#delete" do
it "should do nothing" do
group = Class.new(Spec::ExampleGroup) do
describe("Some Examples")
it("does something") {}
end
adapter = create_adapter(group)
adapter.delete(adapter.examples.first)
adapter.should be_empty
end
end
end
end
end

View file

@ -0,0 +1,45 @@
require File.dirname(__FILE__) + '/test_unit_spec_helper'
describe "ExampleGroup with test/unit/interop" do
include TestUnitSpecHelper
before(:each) do
@dir = File.dirname(__FILE__) + "/resources"
end
describe "with passing examples" do
it "should output 0 failures" do
output = ruby("#{@dir}/spec_that_passes.rb")
output.should include("1 example, 0 failures")
end
it "should return an exit code of 0" do
ruby("#{@dir}/spec_that_passes.rb")
$?.should == 0
end
end
describe "with failing examples" do
it "should output 1 failure" do
output = ruby("#{@dir}/spec_that_fails.rb")
output.should include("1 example, 1 failure")
end
it "should return an exit code of 256" do
ruby("#{@dir}/spec_that_fails.rb")
$?.should == 256
end
end
describe "with example that raises an error" do
it "should output 1 failure" do
output = ruby("#{@dir}/spec_with_errors.rb")
output.should include("1 example, 1 failure")
end
it "should return an exit code of 256" do
ruby("#{@dir}/spec_with_errors.rb")
$?.should == 256
end
end
end

View file

@ -0,0 +1,14 @@
require File.dirname(__FILE__) + '/../../../../spec_helper'
require File.dirname(__FILE__) + '/../../../../ruby_forker'
module TestUnitSpecHelper
include RubyForker
def run_script(file_name)
output = ruby(file_name)
if !$?.success? || output.include?("FAILED") || output.include?("Error")
raise output
end
output
end
end

View file

@ -0,0 +1,45 @@
require File.dirname(__FILE__) + '/test_unit_spec_helper'
describe "Test::Unit::TestCase" do
include TestUnitSpecHelper
before(:each) do
@dir = File.dirname(__FILE__) + "/resources"
end
describe "with passing test case" do
it "should output 0 failures" do
output = ruby("#{@dir}/test_case_that_passes.rb")
output.should include("1 example, 0 failures")
end
it "should return an exit code of 0" do
ruby("#{@dir}/test_case_that_passes.rb")
$?.should == 0
end
end
describe "with failing test case" do
it "should output 1 failure" do
output = ruby("#{@dir}/test_case_that_fails.rb")
output.should include("1 example, 1 failure")
end
it "should return an exit code of 256" do
ruby("#{@dir}/test_case_that_fails.rb")
$?.should == 256
end
end
describe "with test case that raises an error" do
it "should output 1 failure" do
output = ruby("#{@dir}/test_case_with_errors.rb")
output.should include("1 example, 1 failure")
end
it "should return an exit code of 256" do
ruby("#{@dir}/test_case_with_errors.rb")
$?.should == 256
end
end
end

View file

@ -0,0 +1,9 @@
require File.dirname(__FILE__) + '/test_unit_spec_helper'
describe "TestSuiteAdapter" do
include TestUnitSpecHelper
it "should pass" do
dir = File.dirname(__FILE__)
run_script "#{dir}/resources/testsuite_adapter_spec_with_test_unit.rb"
end
end

View file

@ -0,0 +1,39 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Matchers
describe BeClose do
it "should match when value == target" do
BeClose.new(5.0, 0.5).matches?(5.0).should be_true
end
it "should match when value < (target + delta)" do
BeClose.new(5.0, 0.5).matches?(5.49).should be_true
end
it "should match when value > (target - delta)" do
BeClose.new(5.0, 0.5).matches?(4.51).should be_true
end
it "should not match when value == (target - delta)" do
BeClose.new(5.0, 0.5).matches?(4.5).should be_false
end
it "should not match when value < (target - delta)" do
BeClose.new(5.0, 0.5).matches?(4.49).should be_false
end
it "should not match when value == (target + delta)" do
BeClose.new(5.0, 0.5).matches?(5.5).should be_false
end
it "should not match when value > (target + delta)" do
BeClose.new(5.0, 0.5).matches?(5.51).should be_false
end
it "should provide a useful failure message" do
#given
matcher = BeClose.new(5.0, 0.5)
#when
matcher.matches?(5.51)
#then
matcher.failure_message.should == "expected 5.0 +/- (< 0.5), got 5.51"
end
it "should describe itself" do
BeClose.new(5.0, 0.5).description.should == "be close to 5.0 (within +- 0.5)"
end
end
end
end

View file

@ -0,0 +1,248 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
describe "should be_predicate" do
it "should pass when actual returns true for :predicate?" do
actual = stub("actual", :happy? => true)
actual.should be_happy
end
it "should pass when actual returns true for :predicates? (present tense)" do
actual = stub("actual", :exists? => true)
actual.should be_exist
end
it "should fail when actual returns false for :predicate?" do
actual = stub("actual", :happy? => false)
lambda {
actual.should be_happy
}.should fail_with("expected happy? to return true, got false")
end
it "should fail when actual does not respond to :predicate?" do
lambda {
Object.new.should be_happy
}.should raise_error(NameError)
end
end
describe "should_not be_predicate" do
it "should pass when actual returns false for :sym?" do
actual = stub("actual", :happy? => false)
actual.should_not be_happy
end
it "should fail when actual returns true for :sym?" do
actual = stub("actual", :happy? => true)
lambda {
actual.should_not be_happy
}.should fail_with("expected happy? to return false, got true")
end
it "should fail when actual does not respond to :sym?" do
lambda {
Object.new.should_not be_happy
}.should raise_error(NameError)
end
end
describe "should be_predicate(*args)" do
it "should pass when actual returns true for :predicate?(*args)" do
actual = mock("actual")
actual.should_receive(:older_than?).with(3).and_return(true)
actual.should be_older_than(3)
end
it "should fail when actual returns false for :predicate?(*args)" do
actual = mock("actual")
actual.should_receive(:older_than?).with(3).and_return(false)
lambda {
actual.should be_older_than(3)
}.should fail_with("expected older_than?(3) to return true, got false")
end
it "should fail when actual does not respond to :predicate?" do
lambda {
Object.new.should be_older_than(3)
}.should raise_error(NameError)
end
end
describe "should_not be_predicate(*args)" do
it "should pass when actual returns false for :predicate?(*args)" do
actual = mock("actual")
actual.should_receive(:older_than?).with(3).and_return(false)
actual.should_not be_older_than(3)
end
it "should fail when actual returns true for :predicate?(*args)" do
actual = mock("actual")
actual.should_receive(:older_than?).with(3).and_return(true)
lambda {
actual.should_not be_older_than(3)
}.should fail_with("expected older_than?(3) to return false, got true")
end
it "should fail when actual does not respond to :predicate?" do
lambda {
Object.new.should_not be_older_than(3)
}.should raise_error(NameError)
end
end
describe "should be_true" do
it "should pass when actual equal(true)" do
true.should be_true
end
it "should fail when actual equal(false)" do
lambda {
false.should be_true
}.should fail_with("expected true, got false")
end
end
describe "should be_false" do
it "should pass when actual equal(false)" do
false.should be_false
end
it "should fail when actual equal(true)" do
lambda {
true.should be_false
}.should fail_with("expected false, got true")
end
end
describe "should be_nil" do
it "should pass when actual is nil" do
nil.should be_nil
end
it "should fail when actual is not nil" do
lambda {
:not_nil.should be_nil
}.should fail_with("expected nil, got :not_nil")
end
end
describe "should_not be_nil" do
it "should pass when actual is not nil" do
:not_nil.should_not be_nil
end
it "should fail when actual is nil" do
lambda {
nil.should_not be_nil
}.should fail_with("expected not nil, got nil")
end
end
describe "should be <" do
it "should pass when < operator returns true" do
3.should be < 4
end
it "should fail when < operator returns false" do
lambda { 3.should be < 3 }.should fail_with("expected < 3, got 3")
end
end
describe "should be <=" do
it "should pass when <= operator returns true" do
3.should be <= 4
4.should be <= 4
end
it "should fail when <= operator returns false" do
lambda { 3.should be <= 2 }.should fail_with("expected <= 2, got 3")
end
end
describe "should be >=" do
it "should pass when >= operator returns true" do
4.should be >= 4
5.should be >= 4
end
it "should fail when >= operator returns false" do
lambda { 3.should be >= 4 }.should fail_with("expected >= 4, got 3")
end
end
describe "should be >" do
it "should pass when > operator returns true" do
5.should be > 4
end
it "should fail when > operator returns false" do
lambda { 3.should be > 4 }.should fail_with("expected > 4, got 3")
end
end
describe "should be ==" do
it "should pass when == operator returns true" do
5.should be == 5
end
it "should fail when == operator returns false" do
lambda { 3.should be == 4 }.should fail_with("expected == 4, got 3")
end
end
describe "should be ===" do
it "should pass when === operator returns true" do
Hash.should be === Hash.new
end
it "should fail when === operator returns false" do
lambda { Hash.should be === "not a hash" }.should fail_with(%[expected === "not a hash", got Hash])
end
end
describe "should be" do
it "should pass if actual is true or a set value" do
true.should be
1.should be
end
it "should fail if actual is false" do
lambda {false.should be}.should fail_with("expected if to be satisfied, got false")
end
it "should fail if actual is nil" do
lambda {nil.should be}.should fail_with("expected if to be satisfied, got nil")
end
end
describe "should be(value)" do
it "should pass if actual.equal?(value)" do
5.should be(5)
end
it "should fail if !actual.equal?(value)" do
lambda { 5.should be(6) }.should fail_with("expected 6, got 5")
end
end
describe "arbitrary predicate with DelegateClass" do
it "should access methods defined in the delegating class (LH[#48])" do
pending(%{
Looks like DelegateClass is delegating #should to the
delegate. Not sure how to fix this one. Or if we even should."
})
require 'delegate'
class ArrayDelegate < DelegateClass(Array)
def initialize(array)
@internal_array = array
super(@internal_array)
end
def large?
@internal_array.size >= 5
end
end
delegate = ArrayDelegate.new([1,2,3,4,5,6])
delegate.should be_large
end
end

View file

@ -0,0 +1,319 @@
#Based on patch from Wilson Bilkovich
require File.dirname(__FILE__) + '/../../spec_helper.rb'
class SomethingExpected
attr_accessor :some_value
end
describe "should change(actual, message)" do
before(:each) do
@instance = SomethingExpected.new
@instance.some_value = 5
end
it "should pass when actual is modified by the block" do
lambda {@instance.some_value = 6}.should change(@instance, :some_value)
end
it "should fail when actual is not modified by the block" do
lambda do
lambda {}.should change(@instance, :some_value)
end.should fail_with("some_value should have changed, but is still 5")
end
end
describe "should_not change(actual, message)" do
before(:each) do
@instance = SomethingExpected.new
@instance.some_value = 5
end
it "should pass when actual is not modified by the block" do
lambda { }.should_not change(@instance, :some_value)
end
it "should fail when actual is not modified by the block" do
lambda do
lambda {@instance.some_value = 6}.should_not change(@instance, :some_value)
end.should fail_with("some_value should not have changed, but did change from 5 to 6")
end
end
describe "should change { block }" do
before(:each) do
@instance = SomethingExpected.new
@instance.some_value = 5
end
it "should pass when actual is modified by the block" do
lambda {@instance.some_value = 6}.should change { @instance.some_value }
end
it "should fail when actual is not modified by the block" do
lambda do
lambda {}.should change{ @instance.some_value }
end.should fail_with("result should have changed, but is still 5")
end
it "should warn if passed a block using do/end" do
lambda do
lambda {}.should change do
end
end.should raise_error(Spec::Matchers::MatcherError, /block passed to should or should_not/)
end
end
describe "should_not change { block }" do
before(:each) do
@instance = SomethingExpected.new
@instance.some_value = 5
end
it "should pass when actual is modified by the block" do
lambda {}.should_not change{ @instance.some_value }
end
it "should fail when actual is not modified by the block" do
lambda do
lambda {@instance.some_value = 6}.should_not change { @instance.some_value }
end.should fail_with("result should not have changed, but did change from 5 to 6")
end
it "should warn if passed a block using do/end" do
lambda do
lambda {}.should_not change do
end
end.should raise_error(Spec::Matchers::MatcherError, /block passed to should or should_not/)
end
end
describe "should change(actual, message).by(expected)" do
before(:each) do
@instance = SomethingExpected.new
@instance.some_value = 5
end
it "should pass when attribute is changed by expected amount" do
lambda { @instance.some_value += 1 }.should change(@instance, :some_value).by(1)
end
it "should fail when the attribute is changed by unexpected amount" do
lambda do
lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by(1)
end.should fail_with("some_value should have been changed by 1, but was changed by 2")
end
it "should fail when the attribute is changed by unexpected amount in the opposite direction" do
lambda do
lambda { @instance.some_value -= 1 }.should change(@instance, :some_value).by(1)
end.should fail_with("some_value should have been changed by 1, but was changed by -1")
end
end
describe "should change{ block }.by(expected)" do
before(:each) do
@instance = SomethingExpected.new
@instance.some_value = 5
end
it "should pass when attribute is changed by expected amount" do
lambda { @instance.some_value += 1 }.should change{@instance.some_value}.by(1)
end
it "should fail when the attribute is changed by unexpected amount" do
lambda do
lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by(1)
end.should fail_with("result should have been changed by 1, but was changed by 2")
end
it "should fail when the attribute is changed by unexpected amount in the opposite direction" do
lambda do
lambda { @instance.some_value -= 1 }.should change{@instance.some_value}.by(1)
end.should fail_with("result should have been changed by 1, but was changed by -1")
end
end
describe "should change(actual, message).by_at_least(expected)" do
before(:each) do
@instance = SomethingExpected.new
@instance.some_value = 5
end
it "should pass when attribute is changed by greater than the expected amount" do
lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by_at_least(1)
end
it "should pass when attribute is changed by the expected amount" do
lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by_at_least(2)
end
it "should fail when the attribute is changed by less than the expected amount" do
lambda do
lambda { @instance.some_value += 1 }.should change(@instance, :some_value).by_at_least(2)
end.should fail_with("some_value should have been changed by at least 2, but was changed by 1")
end
end
describe "should change{ block }.by_at_least(expected)" do
before(:each) do
@instance = SomethingExpected.new
@instance.some_value = 5
end
it "should pass when attribute is changed by greater than expected amount" do
lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by_at_least(1)
end
it "should pass when attribute is changed by the expected amount" do
lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by_at_least(2)
end
it "should fail when the attribute is changed by less than the unexpected amount" do
lambda do
lambda { @instance.some_value += 1 }.should change{@instance.some_value}.by_at_least(2)
end.should fail_with("result should have been changed by at least 2, but was changed by 1")
end
end
describe "should change(actual, message).by_at_most(expected)" do
before(:each) do
@instance = SomethingExpected.new
@instance.some_value = 5
end
it "should pass when attribute is changed by less than the expected amount" do
lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by_at_most(3)
end
it "should pass when attribute is changed by the expected amount" do
lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by_at_most(2)
end
it "should fail when the attribute is changed by greater than the expected amount" do
lambda do
lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by_at_most(1)
end.should fail_with("some_value should have been changed by at most 1, but was changed by 2")
end
end
describe "should change{ block }.by_at_most(expected)" do
before(:each) do
@instance = SomethingExpected.new
@instance.some_value = 5
end
it "should pass when attribute is changed by less than expected amount" do
lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by_at_most(3)
end
it "should pass when attribute is changed by the expected amount" do
lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by_at_most(2)
end
it "should fail when the attribute is changed by greater than the unexpected amount" do
lambda do
lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by_at_most(1)
end.should fail_with("result should have been changed by at most 1, but was changed by 2")
end
end
describe "should change(actual, message).from(old)" do
before(:each) do
@instance = SomethingExpected.new
@instance.some_value = 'string'
end
it "should pass when attribute is == to expected value before executing block" do
lambda { @instance.some_value = "astring" }.should change(@instance, :some_value).from("string")
end
it "should fail when attribute is not == to expected value before executing block" do
lambda do
lambda { @instance.some_value = "knot" }.should change(@instance, :some_value).from("cat")
end.should fail_with("some_value should have initially been \"cat\", but was \"string\"")
end
end
describe "should change{ block }.from(old)" do
before(:each) do
@instance = SomethingExpected.new
@instance.some_value = 'string'
end
it "should pass when attribute is == to expected value before executing block" do
lambda { @instance.some_value = "astring" }.should change{@instance.some_value}.from("string")
end
it "should fail when attribute is not == to expected value before executing block" do
lambda do
lambda { @instance.some_value = "knot" }.should change{@instance.some_value}.from("cat")
end.should fail_with("result should have initially been \"cat\", but was \"string\"")
end
end
describe "should change(actual, message).to(new)" do
before(:each) do
@instance = SomethingExpected.new
@instance.some_value = 'string'
end
it "should pass when attribute is == to expected value after executing block" do
lambda { @instance.some_value = "cat" }.should change(@instance, :some_value).to("cat")
end
it "should fail when attribute is not == to expected value after executing block" do
lambda do
lambda { @instance.some_value = "cat" }.should change(@instance, :some_value).from("string").to("dog")
end.should fail_with("some_value should have been changed to \"dog\", but is now \"cat\"")
end
end
describe "should change{ block }.to(new)" do
before(:each) do
@instance = SomethingExpected.new
@instance.some_value = 'string'
end
it "should pass when attribute is == to expected value after executing block" do
lambda { @instance.some_value = "cat" }.should change{@instance.some_value}.to("cat")
end
it "should fail when attribute is not == to expected value after executing block" do
lambda do
lambda { @instance.some_value = "cat" }.should change{@instance.some_value}.from("string").to("dog")
end.should fail_with("result should have been changed to \"dog\", but is now \"cat\"")
end
end
describe "should change(actual, message).from(old).to(new)" do
before(:each) do
@instance = SomethingExpected.new
@instance.some_value = 'string'
end
it "should pass when #to comes before #from" do
lambda { @instance.some_value = "cat" }.should change(@instance, :some_value).to("cat").from("string")
end
it "should pass when #from comes before #to" do
lambda { @instance.some_value = "cat" }.should change(@instance, :some_value).from("string").to("cat")
end
end
describe "should change{ block }.from(old).to(new)" do
before(:each) do
@instance = SomethingExpected.new
@instance.some_value = 'string'
end
it "should pass when #to comes before #from" do
lambda { @instance.some_value = "cat" }.should change{@instance.some_value}.to("cat").from("string")
end
it "should pass when #from comes before #to" do
lambda { @instance.some_value = "cat" }.should change{@instance.some_value}.from("string").to("cat")
end
end

View file

@ -0,0 +1,153 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
describe "Matchers should be able to generate their own descriptions" do
after(:each) do
Spec::Matchers.clear_generated_description
end
it "should == expected" do
"this".should == "this"
Spec::Matchers.generated_description.should == "should == \"this\""
end
it "should not == expected" do
"this".should_not == "that"
Spec::Matchers.generated_description.should == "should not == \"that\""
end
it "should be empty (arbitrary predicate)" do
[].should be_empty
Spec::Matchers.generated_description.should == "should be empty"
end
it "should not be empty (arbitrary predicate)" do
[1].should_not be_empty
Spec::Matchers.generated_description.should == "should not be empty"
end
it "should be true" do
true.should be_true
Spec::Matchers.generated_description.should == "should be true"
end
it "should be false" do
false.should be_false
Spec::Matchers.generated_description.should == "should be false"
end
it "should be nil" do
nil.should be_nil
Spec::Matchers.generated_description.should == "should be nil"
end
it "should be > n" do
5.should be > 3
Spec::Matchers.generated_description.should == "should be > 3"
end
it "should be predicate arg1, arg2 and arg3" do
5.0.should be_between(0,10)
Spec::Matchers.generated_description.should == "should be between 0 and 10"
end
it "should be_few_words predicate should be transformed to 'be few words'" do
5.should be_kind_of(Fixnum)
Spec::Matchers.generated_description.should == "should be kind of Fixnum"
end
it "should preserve a proper prefix for be predicate" do
5.should be_a_kind_of(Fixnum)
Spec::Matchers.generated_description.should == "should be a kind of Fixnum"
5.should be_an_instance_of(Fixnum)
Spec::Matchers.generated_description.should == "should be an instance of Fixnum"
end
it "should equal" do
expected = "expected"
expected.should equal(expected)
Spec::Matchers.generated_description.should == "should equal \"expected\""
end
it "should_not equal" do
5.should_not equal(37)
Spec::Matchers.generated_description.should == "should not equal 37"
end
it "should eql" do
"string".should eql("string")
Spec::Matchers.generated_description.should == "should eql \"string\""
end
it "should not eql" do
"a".should_not eql(:a)
Spec::Matchers.generated_description.should == "should not eql :a"
end
it "should have_key" do
{:a => "a"}.should have_key(:a)
Spec::Matchers.generated_description.should == "should have key :a"
end
it "should have n items" do
team.should have(3).players
Spec::Matchers.generated_description.should == "should have 3 players"
end
it "should have at least n items" do
team.should have_at_least(2).players
Spec::Matchers.generated_description.should == "should have at least 2 players"
end
it "should have at most n items" do
team.should have_at_most(4).players
Spec::Matchers.generated_description.should == "should have at most 4 players"
end
it "should include" do
[1,2,3].should include(3)
Spec::Matchers.generated_description.should == "should include 3"
end
it "should match" do
"this string".should match(/this string/)
Spec::Matchers.generated_description.should == "should match /this string/"
end
it "should raise_error" do
lambda { raise }.should raise_error
Spec::Matchers.generated_description.should == "should raise Exception"
end
it "should raise_error with type" do
lambda { raise }.should raise_error(RuntimeError)
Spec::Matchers.generated_description.should == "should raise RuntimeError"
end
it "should raise_error with type and message" do
lambda { raise "there was an error" }.should raise_error(RuntimeError, "there was an error")
Spec::Matchers.generated_description.should == "should raise RuntimeError with \"there was an error\""
end
it "should respond_to" do
[].should respond_to(:insert)
Spec::Matchers.generated_description.should == "should respond to #insert"
end
it "should throw symbol" do
lambda { throw :what_a_mess }.should throw_symbol
Spec::Matchers.generated_description.should == "should throw a Symbol"
end
it "should throw symbol (with named symbol)" do
lambda { throw :what_a_mess }.should throw_symbol(:what_a_mess)
Spec::Matchers.generated_description.should == "should throw :what_a_mess"
end
def team
Class.new do
def players
[1,2,3]
end
end.new
end
end

View file

@ -0,0 +1,28 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Matchers
describe Eql do
it "should match when actual.eql?(expected)" do
Eql.new(1).matches?(1).should be_true
end
it "should not match when !actual.eql?(expected)" do
Eql.new(1).matches?(2).should be_false
end
it "should describe itself" do
matcher = Eql.new(1)
matcher.description.should == "eql 1"
end
it "should provide message, expected and actual on #failure_message" do
matcher = Eql.new("1")
matcher.matches?(1)
matcher.failure_message.should == ["expected \"1\", got 1 (using .eql?)", "1", 1]
end
it "should provide message, expected and actual on #negative_failure_message" do
matcher = Eql.new(1)
matcher.matches?(1)
matcher.negative_failure_message.should == ["expected 1 not to equal 1 (using .eql?)", 1, 1]
end
end
end
end

View file

@ -0,0 +1,28 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Matchers
describe Equal do
it "should match when actual.equal?(expected)" do
Equal.new(1).matches?(1).should be_true
end
it "should not match when !actual.equal?(expected)" do
Equal.new("1").matches?("1").should be_false
end
it "should describe itself" do
matcher = Equal.new(1)
matcher.description.should == "equal 1"
end
it "should provide message, expected and actual on #failure_message" do
matcher = Equal.new("1")
matcher.matches?(1)
matcher.failure_message.should == ["expected \"1\", got 1 (using .equal?)", "1", 1]
end
it "should provide message, expected and actual on #negative_failure_message" do
matcher = Equal.new(1)
matcher.matches?(1)
matcher.negative_failure_message.should == ["expected 1 not to equal 1 (using .equal?)", 1, 1]
end
end
end
end

View file

@ -0,0 +1,57 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
class Substance
def initialize exists, description
@exists = exists
@description = description
end
def exist?
@exists
end
def inspect
@description
end
end
class SubstanceTester
include Spec::Matchers
def initialize substance
@substance = substance
end
def should_exist
@substance.should exist
end
end
describe "should exist," do
before(:each) do
@real = Substance.new true, 'something real'
@imaginary = Substance.new false, 'something imaginary'
end
describe "within an example group" do
it "should pass if target exists" do
@real.should exist
end
it "should fail if target does not exist" do
lambda { @imaginary.should exist }.should fail
end
it "should pass if target doesn't exist" do
lambda { @real.should_not exist }.should fail
end
end
describe "outside of an example group" do
it "should pass if target exists" do
real_tester = SubstanceTester.new @real
real_tester.should_exist
end
end
end

View file

@ -0,0 +1,129 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module ExampleExpectations
class ArbitraryMatcher
def initialize(*args, &block)
if args.last.is_a? Hash
@expected = args.last[:expected]
end
if block_given?
@expected = block.call
end
@block = block
end
def matches?(target)
@target = target
return @expected == target
end
def with(new_value)
@expected = new_value
self
end
def failure_message
"expected #{@expected}, got #{@target}"
end
def negative_failure_message
"expected not #{@expected}, got #{@target}"
end
end
class PositiveOnlyMatcher < ArbitraryMatcher
undef negative_failure_message rescue nil
end
def arbitrary_matcher(*args, &block)
ArbitraryMatcher.new(*args, &block)
end
def positive_only_matcher(*args, &block)
PositiveOnlyMatcher.new(*args, &block)
end
end
module Spec
module Expectations
describe ExpectationMatcherHandler, ".handle_matcher" do
it "should ask the matcher if it matches" do
matcher = mock("matcher")
actual = Object.new
matcher.should_receive(:matches?).with(actual).and_return(true)
ExpectationMatcherHandler.handle_matcher(actual, matcher)
end
it "should explain when the matcher parameter is not a matcher" do
begin
nonmatcher = mock("nonmatcher")
actual = Object.new
ExpectationMatcherHandler.handle_matcher(actual, nonmatcher)
rescue Spec::Expectations::InvalidMatcherError => e
end
e.message.should =~ /^Expected a matcher, got /
end
end
describe NegativeExpectationMatcherHandler, ".handle_matcher" do
it "should explain when matcher does not support should_not" do
matcher = mock("matcher")
matcher.stub!(:matches?)
actual = Object.new
lambda {
NegativeExpectationMatcherHandler.handle_matcher(actual, matcher)
}.should fail_with(/Matcher does not support should_not.\n/)
end
it "should ask the matcher if it matches" do
matcher = mock("matcher")
actual = Object.new
matcher.stub!(:negative_failure_message)
matcher.should_receive(:matches?).with(actual).and_return(false)
NegativeExpectationMatcherHandler.handle_matcher(actual, matcher)
end
it "should explain when the matcher parameter is not a matcher" do
begin
nonmatcher = mock("nonmatcher")
actual = Object.new
NegativeExpectationMatcherHandler.handle_matcher(actual, nonmatcher)
rescue Spec::Expectations::InvalidMatcherError => e
end
e.message.should =~ /^Expected a matcher, got /
end
end
describe ExpectationMatcherHandler do
include ExampleExpectations
it "should handle submitted args" do
5.should arbitrary_matcher(:expected => 5)
5.should arbitrary_matcher(:expected => "wrong").with(5)
lambda { 5.should arbitrary_matcher(:expected => 4) }.should fail_with("expected 4, got 5")
lambda { 5.should arbitrary_matcher(:expected => 5).with(4) }.should fail_with("expected 4, got 5")
5.should_not arbitrary_matcher(:expected => 4)
5.should_not arbitrary_matcher(:expected => 5).with(4)
lambda { 5.should_not arbitrary_matcher(:expected => 5) }.should fail_with("expected not 5, got 5")
lambda { 5.should_not arbitrary_matcher(:expected => 4).with(5) }.should fail_with("expected not 5, got 5")
end
it "should handle the submitted block" do
5.should arbitrary_matcher { 5 }
5.should arbitrary_matcher(:expected => 4) { 5 }
5.should arbitrary_matcher(:expected => 4).with(5) { 3 }
end
it "should explain when matcher does not support should_not" do
lambda {
5.should_not positive_only_matcher(:expected => 5)
}.should fail_with(/Matcher does not support should_not.\n/)
end
end
end
end

View file

@ -0,0 +1,53 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
describe "should have_sym(*args)" do
it "should pass if #has_sym?(*args) returns true" do
{:a => "A"}.should have_key(:a)
end
it "should fail if #has_sym?(*args) returns false" do
lambda {
{:b => "B"}.should have_key(:a)
}.should fail_with("expected #has_key?(:a) to return true, got false")
end
it "should fail if target does not respond to #has_sym?" do
lambda {
Object.new.should have_key(:a)
}.should raise_error(NoMethodError)
end
it "should reraise an exception thrown in #has_sym?(*args)" do
o = Object.new
def o.has_sym?(*args)
raise "Funky exception"
end
lambda { o.should have_sym(:foo) }.should raise_error("Funky exception")
end
end
describe "should_not have_sym(*args)" do
it "should pass if #has_sym?(*args) returns false" do
{:a => "A"}.should_not have_key(:b)
end
it "should fail if #has_sym?(*args) returns true" do
lambda {
{:a => "A"}.should_not have_key(:a)
}.should fail_with("expected #has_key?(:a) to return false, got true")
end
it "should fail if target does not respond to #has_sym?" do
lambda {
Object.new.should have_key(:a)
}.should raise_error(NoMethodError)
end
it "should reraise an exception thrown in #has_sym?(*args)" do
o = Object.new
def o.has_sym?(*args)
raise "Funky exception"
end
lambda { o.should_not have_sym(:foo) }.should raise_error("Funky exception")
end
end

View file

@ -0,0 +1,293 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module HaveSpecHelper
def create_collection_owner_with(n)
owner = Spec::Expectations::Helper::CollectionOwner.new
(1..n).each do |n|
owner.add_to_collection_with_length_method(n)
owner.add_to_collection_with_size_method(n)
end
owner
end
end
describe "should have(n).items" do
include HaveSpecHelper
it "should pass if target has a collection of items with n members" do
owner = create_collection_owner_with(3)
owner.should have(3).items_in_collection_with_length_method
owner.should have(3).items_in_collection_with_size_method
end
it "should convert :no to 0" do
owner = create_collection_owner_with(0)
owner.should have(:no).items_in_collection_with_length_method
owner.should have(:no).items_in_collection_with_size_method
end
it "should fail if target has a collection of items with < n members" do
owner = create_collection_owner_with(3)
lambda {
owner.should have(4).items_in_collection_with_length_method
}.should fail_with("expected 4 items_in_collection_with_length_method, got 3")
lambda {
owner.should have(4).items_in_collection_with_size_method
}.should fail_with("expected 4 items_in_collection_with_size_method, got 3")
end
it "should fail if target has a collection of items with > n members" do
owner = create_collection_owner_with(3)
lambda {
owner.should have(2).items_in_collection_with_length_method
}.should fail_with("expected 2 items_in_collection_with_length_method, got 3")
lambda {
owner.should have(2).items_in_collection_with_size_method
}.should fail_with("expected 2 items_in_collection_with_size_method, got 3")
end
end
describe 'should have(1).item when ActiveSupport::Inflector is defined' do
include HaveSpecHelper
before do
unless defined?(ActiveSupport::Inflector)
module ActiveSupport
class Inflector
def self.pluralize(string)
string.to_s + 's'
end
end
end
end
end
it 'should pluralize the collection name' do
owner = create_collection_owner_with(1)
owner.should have(1).item
end
end
describe "should have(n).items where result responds to items but returns something other than a collection" do
it "should provide a meaningful error" do
owner = Class.new do
def items
Object.new
end
end.new
lambda do
owner.should have(3).items
end.should raise_error("expected items to be a collection but it does not respond to #length or #size")
end
end
describe "should_not have(n).items" do
include HaveSpecHelper
it "should pass if target has a collection of items with < n members" do
owner = create_collection_owner_with(3)
owner.should_not have(4).items_in_collection_with_length_method
owner.should_not have(4).items_in_collection_with_size_method
end
it "should pass if target has a collection of items with > n members" do
owner = create_collection_owner_with(3)
owner.should_not have(2).items_in_collection_with_length_method
owner.should_not have(2).items_in_collection_with_size_method
end
it "should fail if target has a collection of items with n members" do
owner = create_collection_owner_with(3)
lambda {
owner.should_not have(3).items_in_collection_with_length_method
}.should fail_with("expected target not to have 3 items_in_collection_with_length_method, got 3")
lambda {
owner.should_not have(3).items_in_collection_with_size_method
}.should fail_with("expected target not to have 3 items_in_collection_with_size_method, got 3")
end
end
describe "should have_exactly(n).items" do
include HaveSpecHelper
it "should pass if target has a collection of items with n members" do
owner = create_collection_owner_with(3)
owner.should have_exactly(3).items_in_collection_with_length_method
owner.should have_exactly(3).items_in_collection_with_size_method
end
it "should convert :no to 0" do
owner = create_collection_owner_with(0)
owner.should have_exactly(:no).items_in_collection_with_length_method
owner.should have_exactly(:no).items_in_collection_with_size_method
end
it "should fail if target has a collection of items with < n members" do
owner = create_collection_owner_with(3)
lambda {
owner.should have_exactly(4).items_in_collection_with_length_method
}.should fail_with("expected 4 items_in_collection_with_length_method, got 3")
lambda {
owner.should have_exactly(4).items_in_collection_with_size_method
}.should fail_with("expected 4 items_in_collection_with_size_method, got 3")
end
it "should fail if target has a collection of items with > n members" do
owner = create_collection_owner_with(3)
lambda {
owner.should have_exactly(2).items_in_collection_with_length_method
}.should fail_with("expected 2 items_in_collection_with_length_method, got 3")
lambda {
owner.should have_exactly(2).items_in_collection_with_size_method
}.should fail_with("expected 2 items_in_collection_with_size_method, got 3")
end
end
describe "should have_at_least(n).items" do
include HaveSpecHelper
it "should pass if target has a collection of items with n members" do
owner = create_collection_owner_with(3)
owner.should have_at_least(3).items_in_collection_with_length_method
owner.should have_at_least(3).items_in_collection_with_size_method
end
it "should pass if target has a collection of items with > n members" do
owner = create_collection_owner_with(3)
owner.should have_at_least(2).items_in_collection_with_length_method
owner.should have_at_least(2).items_in_collection_with_size_method
end
it "should fail if target has a collection of items with < n members" do
owner = create_collection_owner_with(3)
lambda {
owner.should have_at_least(4).items_in_collection_with_length_method
}.should fail_with("expected at least 4 items_in_collection_with_length_method, got 3")
lambda {
owner.should have_at_least(4).items_in_collection_with_size_method
}.should fail_with("expected at least 4 items_in_collection_with_size_method, got 3")
end
it "should provide educational negative failure messages" do
#given
owner = create_collection_owner_with(3)
length_matcher = have_at_least(3).items_in_collection_with_length_method
size_matcher = have_at_least(3).items_in_collection_with_size_method
#when
length_matcher.matches?(owner)
size_matcher.matches?(owner)
#then
length_matcher.negative_failure_message.should == <<-EOF
Isn't life confusing enough?
Instead of having to figure out the meaning of this:
should_not have_at_least(3).items_in_collection_with_length_method
We recommend that you use this instead:
should have_at_most(2).items_in_collection_with_length_method
EOF
size_matcher.negative_failure_message.should == <<-EOF
Isn't life confusing enough?
Instead of having to figure out the meaning of this:
should_not have_at_least(3).items_in_collection_with_size_method
We recommend that you use this instead:
should have_at_most(2).items_in_collection_with_size_method
EOF
end
end
describe "should have_at_most(n).items" do
include HaveSpecHelper
it "should pass if target has a collection of items with n members" do
owner = create_collection_owner_with(3)
owner.should have_at_most(3).items_in_collection_with_length_method
owner.should have_at_most(3).items_in_collection_with_size_method
end
it "should fail if target has a collection of items with > n members" do
owner = create_collection_owner_with(3)
lambda {
owner.should have_at_most(2).items_in_collection_with_length_method
}.should fail_with("expected at most 2 items_in_collection_with_length_method, got 3")
lambda {
owner.should have_at_most(2).items_in_collection_with_size_method
}.should fail_with("expected at most 2 items_in_collection_with_size_method, got 3")
end
it "should pass if target has a collection of items with < n members" do
owner = create_collection_owner_with(3)
owner.should have_at_most(4).items_in_collection_with_length_method
owner.should have_at_most(4).items_in_collection_with_size_method
end
it "should provide educational negative failure messages" do
#given
owner = create_collection_owner_with(3)
length_matcher = have_at_most(3).items_in_collection_with_length_method
size_matcher = have_at_most(3).items_in_collection_with_size_method
#when
length_matcher.matches?(owner)
size_matcher.matches?(owner)
#then
length_matcher.negative_failure_message.should == <<-EOF
Isn't life confusing enough?
Instead of having to figure out the meaning of this:
should_not have_at_most(3).items_in_collection_with_length_method
We recommend that you use this instead:
should have_at_least(4).items_in_collection_with_length_method
EOF
size_matcher.negative_failure_message.should == <<-EOF
Isn't life confusing enough?
Instead of having to figure out the meaning of this:
should_not have_at_most(3).items_in_collection_with_size_method
We recommend that you use this instead:
should have_at_least(4).items_in_collection_with_size_method
EOF
end
end
describe "have(n).items(args, block)" do
it "should pass args to target" do
target = mock("target")
target.should_receive(:items).with("arg1","arg2").and_return([1,2,3])
target.should have(3).items("arg1","arg2")
end
it "should pass block to target" do
target = mock("target")
block = lambda { 5 }
target.should_receive(:items).with("arg1","arg2", block).and_return([1,2,3])
target.should have(3).items("arg1","arg2", block)
end
end
describe "have(n).items where target IS a collection" do
it "should reference the number of items IN the collection" do
[1,2,3].should have(3).items
end
it "should fail when the number of items IN the collection is not as expected" do
lambda { [1,2,3].should have(7).items }.should fail_with("expected 7 items, got 3")
end
end
describe "have(n).characters where target IS a String" do
it "should pass if the length is correct" do
"this string".should have(11).characters
end
it "should fail if the length is incorrect" do
lambda { "this string".should have(12).characters }.should fail_with("expected 12 characters, got 11")
end
end
describe "have(n).things on an object which is not a collection nor contains one" do
it "should fail" do
lambda { Object.new.should have(2).things }.should raise_error(NoMethodError, /undefined method `things' for #<Object:/)
end
end

View file

@ -0,0 +1,45 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
describe "should include(expected)" do
it "should pass if target includes expected" do
[1,2,3].should include(3)
"abc".should include("a")
end
it "should fail if target does not include expected" do
lambda {
[1,2,3].should include(4)
}.should fail_with("expected [1, 2, 3] to include 4")
lambda {
"abc".should include("d")
}.should fail_with("expected \"abc\" to include \"d\"")
end
end
describe "should include(with, multiple, args)" do
it "should pass if target includes all items" do
[1,2,3].should include(1,2,3)
end
it "should fail if target does not include any one of the items" do
lambda {
[1,2,3].should include(1,2,4)
}.should fail_with("expected [1, 2, 3] to include 1, 2 and 4")
end
end
describe "should_not include(expected)" do
it "should pass if target does not include expected" do
[1,2,3].should_not include(4)
"abc".should_not include("d")
end
it "should fail if target includes expected" do
lambda {
[1,2,3].should_not include(3)
}.should fail_with("expected [1, 2, 3] not to include 3")
lambda {
"abc".should_not include("c")
}.should fail_with("expected \"abc\" not to include \"c\"")
end
end

View file

@ -0,0 +1,37 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
describe "should match(expected)" do
it "should pass when target (String) matches expected (Regexp)" do
"string".should match(/tri/)
end
it "should fail when target (String) does not match expected (Regexp)" do
lambda {
"string".should match(/rings/)
}.should fail
end
it "should provide message, expected and actual on failure" do
matcher = match(/rings/)
matcher.matches?("string")
matcher.failure_message.should == ["expected \"string\" to match /rings/", /rings/, "string"]
end
end
describe "should_not match(expected)" do
it "should pass when target (String) matches does not match (Regexp)" do
"string".should_not match(/rings/)
end
it "should fail when target (String) matches expected (Regexp)" do
lambda {
"string".should_not match(/tri/)
}.should fail
end
it "should provide message, expected and actual on failure" do
matcher = match(/tri/)
matcher.matches?("string")
matcher.negative_failure_message.should == ["expected \"string\" not to match /tri/", /tri/, "string"]
end
end

View file

@ -0,0 +1,78 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Matchers
context %Q{The Spec::Matchers module gets included in the execution context of every spec.
This module should provide the following methods, each of which returns a Matcher object.} do
it "be_true" do
be_true.should be_an_instance_of(Be)
end
it "be_false" do
be_false.should be_an_instance_of(Be)
end
it "be_nil" do
be_nil.should be_an_instance_of(Be)
end
it "be_arbitrary_predicate" do
be_arbitrary_predicate.should be_an_instance_of(Be)
end
it "be_close" do
be_close(1,2).should be_an_instance_of(BeClose)
end
it "change" do
change("target", :message).should be_an_instance_of(Change)
end
it "eql" do
eql(:expected).should be_an_instance_of(Eql)
end
it "equal" do
equal(:expected).should be_an_instance_of(Equal)
end
it "have" do
have(0).should be_an_instance_of(Have)
end
it "have_exactly" do
have_exactly(0).should be_an_instance_of(Have)
end
it "have_at_least" do
have_at_least(0).should be_an_instance_of(Have)
end
it "have_at_most" do
have_at_most(0).should be_an_instance_of(Have)
end
it "include" do
include(:value).should be_an_instance_of(Include)
end
it "match" do
match(:value).should be_an_instance_of(Match)
end
it "raise_error" do
raise_error.should be_an_instance_of(RaiseError)
raise_error(NoMethodError).should be_an_instance_of(RaiseError)
raise_error(NoMethodError, "message").should be_an_instance_of(RaiseError)
end
it "satisfy" do
satisfy{}.should be_an_instance_of(Satisfy)
end
it "throw_symbol" do
throw_symbol.should be_an_instance_of(ThrowSymbol)
throw_symbol(:sym).should be_an_instance_of(ThrowSymbol)
end
it "respond_to" do
respond_to(:sym).should be_an_instance_of(RespondTo)
end
end
describe "Spec::Matchers#method_missing" do
it "should convert be_xyz to Be(:be_xyz)" do
Be.should_receive(:new).with(:be_whatever)
be_whatever
end
it "should convert have_xyz to Has(:have_xyz)" do
Has.should_receive(:new).with(:have_whatever)
have_whatever
end
end
end
end

View file

@ -0,0 +1,24 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
describe "The anything() mock argument constraint matcher" do
specify { anything.should == Object.new }
specify { anything.should == Class }
specify { anything.should == 1 }
specify { anything.should == "a string" }
specify { anything.should == :a_symbol }
end
describe "The boolean() mock argument constraint matcher" do
specify { boolean.should == true }
specify { boolean.should == false }
specify { boolean.should_not == Object.new }
specify { boolean.should_not == Class }
specify { boolean.should_not == 1 }
specify { boolean.should_not == "a string" }
specify { boolean.should_not == :a_symbol }
end
describe "The an_instance_of() mock argument constraint matcher" do
# NOTE - this is implemented as a predicate_matcher - see example_group_methods.rb
specify { an_instance_of(String).should == "string" }
end

View file

@ -0,0 +1,158 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
require 'spec/expectations/differs/default'
describe "should ==" do
it "should delegate message to target" do
subject = "apple"
subject.should_receive(:==).with("apple").and_return(true)
subject.should == "apple"
end
it "should fail when target.==(actual) returns false" do
subject = "apple"
Spec::Expectations.should_receive(:fail_with).with(%[expected: "orange",\n got: "apple" (using ==)], "orange", "apple")
subject.should == "orange"
end
end
describe "should_not ==" do
it "should delegate message to target" do
subject = "orange"
subject.should_receive(:==).with("apple").and_return(false)
subject.should_not == "apple"
end
it "should fail when target.==(actual) returns false" do
subject = "apple"
Spec::Expectations.should_receive(:fail_with).with(%[expected not: == "apple",\n got: "apple"], "apple", "apple")
subject.should_not == "apple"
end
end
describe "should ===" do
it "should delegate message to target" do
subject = "apple"
subject.should_receive(:===).with("apple").and_return(true)
subject.should === "apple"
end
it "should fail when target.===(actual) returns false" do
subject = "apple"
subject.should_receive(:===).with("orange").and_return(false)
Spec::Expectations.should_receive(:fail_with).with(%[expected: "orange",\n got: "apple" (using ===)], "orange", "apple")
subject.should === "orange"
end
end
describe "should_not ===" do
it "should delegate message to target" do
subject = "orange"
subject.should_receive(:===).with("apple").and_return(false)
subject.should_not === "apple"
end
it "should fail when target.===(actual) returns false" do
subject = "apple"
subject.should_receive(:===).with("apple").and_return(true)
Spec::Expectations.should_receive(:fail_with).with(%[expected not: === "apple",\n got: "apple"], "apple", "apple")
subject.should_not === "apple"
end
end
describe "should =~" do
it "should delegate message to target" do
subject = "foo"
subject.should_receive(:=~).with(/oo/).and_return(true)
subject.should =~ /oo/
end
it "should fail when target.=~(actual) returns false" do
subject = "fu"
subject.should_receive(:=~).with(/oo/).and_return(false)
Spec::Expectations.should_receive(:fail_with).with(%[expected: /oo/,\n got: "fu" (using =~)], /oo/, "fu")
subject.should =~ /oo/
end
end
describe "should_not =~" do
it "should delegate message to target" do
subject = "fu"
subject.should_receive(:=~).with(/oo/).and_return(false)
subject.should_not =~ /oo/
end
it "should fail when target.=~(actual) returns false" do
subject = "foo"
subject.should_receive(:=~).with(/oo/).and_return(true)
Spec::Expectations.should_receive(:fail_with).with(%[expected not: =~ /oo/,\n got: "foo"], /oo/, "foo")
subject.should_not =~ /oo/
end
end
describe "should >" do
it "should pass if > passes" do
4.should > 3
end
it "should fail if > fails" do
Spec::Expectations.should_receive(:fail_with).with(%[expected: > 5,\n got: 4], 5, 4)
4.should > 5
end
end
describe "should >=" do
it "should pass if >= passes" do
4.should > 3
4.should >= 4
end
it "should fail if > fails" do
Spec::Expectations.should_receive(:fail_with).with(%[expected: >= 5,\n got: 4], 5, 4)
4.should >= 5
end
end
describe "should <" do
it "should pass if < passes" do
4.should < 5
end
it "should fail if > fails" do
Spec::Expectations.should_receive(:fail_with).with(%[expected: < 3,\n got: 4], 3, 4)
4.should < 3
end
end
describe "should <=" do
it "should pass if <= passes" do
4.should <= 5
4.should <= 4
end
it "should fail if > fails" do
Spec::Expectations.should_receive(:fail_with).with(%[expected: <= 3,\n got: 4], 3, 4)
4.should <= 3
end
end

View file

@ -0,0 +1,315 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
describe "should raise_error" do
it "should pass if anything is raised" do
lambda {raise}.should raise_error
end
it "should fail if nothing is raised" do
lambda {
lambda {}.should raise_error
}.should fail_with("expected Exception but nothing was raised")
end
end
describe "should_not raise_error" do
it "should pass if nothing is raised" do
lambda {}.should_not raise_error
end
it "should fail if anything is raised" do
lambda {
lambda {raise}.should_not raise_error
}.should fail_with("expected no Exception, got RuntimeError")
end
end
describe "should raise_error(message)" do
it "should pass if RuntimeError is raised with the right message" do
lambda {raise 'blah'}.should raise_error('blah')
end
it "should pass if RuntimeError is raised with a matching message" do
lambda {raise 'blah'}.should raise_error(/blah/)
end
it "should pass if any other error is raised with the right message" do
lambda {raise NameError.new('blah')}.should raise_error('blah')
end
it "should fail if RuntimeError error is raised with the wrong message" do
lambda do
lambda {raise 'blarg'}.should raise_error('blah')
end.should fail_with("expected Exception with \"blah\", got #<RuntimeError: blarg>")
end
it "should fail if any other error is raised with the wrong message" do
lambda do
lambda {raise NameError.new('blarg')}.should raise_error('blah')
end.should fail_with("expected Exception with \"blah\", got #<NameError: blarg>")
end
end
describe "should_not raise_error(message)" do
it "should pass if RuntimeError error is raised with the different message" do
lambda {raise 'blarg'}.should_not raise_error('blah')
end
it "should pass if any other error is raised with the wrong message" do
lambda {raise NameError.new('blarg')}.should_not raise_error('blah')
end
it "should fail if RuntimeError is raised with message" do
lambda do
lambda {raise 'blah'}.should_not raise_error('blah')
end.should fail_with(%Q|expected no Exception with "blah", got #<RuntimeError: blah>|)
end
it "should fail if any other error is raised with message" do
lambda do
lambda {raise NameError.new('blah')}.should_not raise_error('blah')
end.should fail_with(%Q|expected no Exception with "blah", got #<NameError: blah>|)
end
end
describe "should raise_error(NamedError)" do
it "should pass if named error is raised" do
lambda { non_existent_method }.should raise_error(NameError)
end
it "should fail if nothing is raised" do
lambda {
lambda { }.should raise_error(NameError)
}.should fail_with("expected NameError but nothing was raised")
end
it "should fail if another error is raised (NameError)" do
lambda {
lambda { raise }.should raise_error(NameError)
}.should fail_with("expected NameError, got RuntimeError")
end
it "should fail if another error is raised (NameError)" do
lambda {
lambda { load "non/existent/file" }.should raise_error(NameError)
}.should fail_with(/expected NameError, got #<LoadError/)
end
end
describe "should_not raise_error(NamedError)" do
it "should pass if nothing is raised" do
lambda { }.should_not raise_error(NameError)
end
it "should pass if another error is raised" do
lambda { raise }.should_not raise_error(NameError)
end
it "should fail if named error is raised" do
lambda {
lambda { non_existent_method }.should_not raise_error(NameError)
}.should fail_with(/expected no NameError, got #<NameError: undefined/)
end
end
describe "should raise_error(NamedError, error_message) with String" do
it "should pass if named error is raised with same message" do
lambda { raise "example message" }.should raise_error(RuntimeError, "example message")
end
it "should fail if nothing is raised" do
lambda {
lambda {}.should raise_error(RuntimeError, "example message")
}.should fail_with("expected RuntimeError with \"example message\" but nothing was raised")
end
it "should fail if incorrect error is raised" do
lambda {
lambda { raise }.should raise_error(NameError, "example message")
}.should fail_with("expected NameError with \"example message\", got RuntimeError")
end
it "should fail if correct error is raised with incorrect message" do
lambda {
lambda { raise RuntimeError.new("not the example message") }.should raise_error(RuntimeError, "example message")
}.should fail_with(/expected RuntimeError with \"example message\", got #<RuntimeError: not the example message/)
end
end
describe "should raise_error(NamedError, error_message) { |err| ... }" do
it "should yield exception if named error is raised with same message" do
ran = false
lambda {
raise "example message"
}.should raise_error(RuntimeError, "example message") { |err|
ran = true
err.class.should == RuntimeError
err.message.should == "example message"
}
ran.should == true
end
it "yielded block should be able to fail on it's own right" do
ran, passed = false, false
lambda {
lambda {
raise "example message"
}.should raise_error(RuntimeError, "example message") { |err|
ran = true
5.should == 4
passed = true
}
}.should fail_with(/expected: 4/m)
ran.should == true
passed.should == false
end
it "should NOT yield exception if no error was thrown" do
ran = false
lambda {
lambda {}.should raise_error(RuntimeError, "example message") { |err|
ran = true
}
}.should fail_with("expected RuntimeError with \"example message\" but nothing was raised")
ran.should == false
end
it "should not yield exception if error class is not matched" do
ran = false
lambda {
lambda {
raise "example message"
}.should raise_error(SyntaxError, "example message") { |err|
ran = true
}
}.should fail_with("expected SyntaxError with \"example message\", got #<RuntimeError: example message>")
ran.should == false
end
it "should NOT yield exception if error message is not matched" do
ran = false
lambda {
lambda {
raise "example message"
}.should raise_error(RuntimeError, "different message") { |err|
ran = true
}
}.should fail_with("expected RuntimeError with \"different message\", got #<RuntimeError: example message>")
ran.should == false
end
end
describe "should_not raise_error(NamedError, error_message) { |err| ... }" do
it "should pass if nothing is raised" do
ran = false
lambda {}.should_not raise_error(RuntimeError, "example message") { |err|
ran = true
}
ran.should == false
end
it "should pass if a different error is raised" do
ran = false
lambda { raise }.should_not raise_error(NameError, "example message") { |err|
ran = true
}
ran.should == false
end
it "should pass if same error is raised with different message" do
ran = false
lambda {
raise RuntimeError.new("not the example message")
}.should_not raise_error(RuntimeError, "example message") { |err|
ran = true
}
ran.should == false
end
it "should fail if named error is raised with same message" do
ran = false
lambda {
lambda {
raise "example message"
}.should_not raise_error(RuntimeError, "example message") { |err|
ran = true
}
}.should fail_with("expected no RuntimeError with \"example message\", got #<RuntimeError: example message>")
ran.should == false
end
end
describe "should_not raise_error(NamedError, error_message) with String" do
it "should pass if nothing is raised" do
lambda {}.should_not raise_error(RuntimeError, "example message")
end
it "should pass if a different error is raised" do
lambda { raise }.should_not raise_error(NameError, "example message")
end
it "should pass if same error is raised with different message" do
lambda { raise RuntimeError.new("not the example message") }.should_not raise_error(RuntimeError, "example message")
end
it "should fail if named error is raised with same message" do
lambda {
lambda { raise "example message" }.should_not raise_error(RuntimeError, "example message")
}.should fail_with("expected no RuntimeError with \"example message\", got #<RuntimeError: example message>")
end
end
describe "should raise_error(NamedError, error_message) with Regexp" do
it "should pass if named error is raised with matching message" do
lambda { raise "example message" }.should raise_error(RuntimeError, /ample mess/)
end
it "should fail if nothing is raised" do
lambda {
lambda {}.should raise_error(RuntimeError, /ample mess/)
}.should fail_with("expected RuntimeError with message matching /ample mess/ but nothing was raised")
end
it "should fail if incorrect error is raised" do
lambda {
lambda { raise }.should raise_error(NameError, /ample mess/)
}.should fail_with("expected NameError with message matching /ample mess/, got RuntimeError")
end
it "should fail if correct error is raised with incorrect message" do
lambda {
lambda { raise RuntimeError.new("not the example message") }.should raise_error(RuntimeError, /less than ample mess/)
}.should fail_with("expected RuntimeError with message matching /less than ample mess/, got #<RuntimeError: not the example message>")
end
end
describe "should_not raise_error(NamedError, error_message) with Regexp" do
it "should pass if nothing is raised" do
lambda {}.should_not raise_error(RuntimeError, /ample mess/)
end
it "should pass if a different error is raised" do
lambda { raise }.should_not raise_error(NameError, /ample mess/)
end
it "should pass if same error is raised with non-matching message" do
lambda { raise RuntimeError.new("non matching message") }.should_not raise_error(RuntimeError, /ample mess/)
end
it "should fail if named error is raised with matching message" do
lambda {
lambda { raise "example message" }.should_not raise_error(RuntimeError, /ample mess/)
}.should fail_with("expected no RuntimeError with message matching /ample mess/, got #<RuntimeError: example message>")
end
end

View file

@ -0,0 +1,54 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
describe "should respond_to(:sym)" do
it "should pass if target responds to :sym" do
Object.new.should respond_to(:methods)
end
it "should fail target does not respond to :sym" do
lambda {
Object.new.should respond_to(:some_method)
}.should fail_with("expected target to respond to :some_method")
end
end
describe "should respond_to(message1, message2)" do
it "should pass if target responds to both messages" do
Object.new.should respond_to('methods', 'inspect')
end
it "should fail target does not respond to first message" do
lambda {
Object.new.should respond_to('method_one', 'inspect')
}.should fail_with('expected target to respond to "method_one"')
end
it "should fail target does not respond to second message" do
lambda {
Object.new.should respond_to('inspect', 'method_one')
}.should fail_with('expected target to respond to "method_one"')
end
it "should fail target does not respond to either message" do
lambda {
Object.new.should respond_to('method_one', 'method_two')
}.should fail_with('expected target to respond to "method_one", "method_two"')
end
end
describe "should_not respond_to(:sym)" do
it "should pass if target does not respond to :sym" do
Object.new.should_not respond_to(:some_method)
end
it "should fail target responds to :sym" do
lambda {
Object.new.should_not respond_to(:methods)
}.should fail_with("expected target not to respond to :methods")
end
end

View file

@ -0,0 +1,36 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
describe "should satisfy { block }" do
it "should pass if block returns true" do
true.should satisfy { |val| val }
true.should satisfy do |val|
val
end
end
it "should fail if block returns false" do
lambda {
false.should satisfy { |val| val }
}.should fail_with("expected false to satisfy block")
lambda do
false.should satisfy do |val|
val
end
end.should fail_with("expected false to satisfy block")
end
end
describe "should_not satisfy { block }" do
it "should pass if block returns false" do
false.should_not satisfy { |val| val }
false.should_not satisfy do |val|
val
end
end
it "should fail if block returns true" do
lambda {
true.should_not satisfy { |val| val }
}.should fail_with("expected true not to satisfy block")
end
end

View file

@ -0,0 +1,31 @@
require File.dirname(__FILE__) + '/../../spec_helper'
module Spec
module Matchers
describe SimpleMatcher do
it "should match pass match arg to block" do
actual = nil
matcher = simple_matcher("message") do |given| actual = given end
matcher.matches?("foo")
actual.should == "foo"
end
it "should provide a stock failure message" do
matcher = simple_matcher("thing") do end
matcher.matches?("other")
matcher.failure_message.should =~ /expected \"thing\" but got \"other\"/
end
it "should provide a stock negative failure message" do
matcher = simple_matcher("thing") do end
matcher.matches?("other")
matcher.negative_failure_message.should =~ /expected not to get \"thing\", but got \"other\"/
end
it "should provide a description" do
matcher = simple_matcher("thing") do end
matcher.description.should =="thing"
end
end
end
end

View file

@ -0,0 +1,54 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Matchers
describe ThrowSymbol, "(constructed with no Symbol)" do
before(:each) { @matcher = ThrowSymbol.new }
it "should match if any Symbol is thrown" do
@matcher.matches?(lambda{ throw :sym }).should be_true
end
it "should not match if no Symbol is thrown" do
@matcher.matches?(lambda{ }).should be_false
end
it "should provide a failure message" do
@matcher.matches?(lambda{})
@matcher.failure_message.should == "expected a Symbol but nothing was thrown"
end
it "should provide a negative failure message" do
@matcher.matches?(lambda{ throw :sym})
@matcher.negative_failure_message.should == "expected no Symbol, got :sym"
end
end
describe ThrowSymbol, "(constructed with a Symbol)" do
before(:each) { @matcher = ThrowSymbol.new(:sym) }
it "should match if correct Symbol is thrown" do
@matcher.matches?(lambda{ throw :sym }).should be_true
end
it "should not match if no Symbol is thrown" do
@matcher.matches?(lambda{ }).should be_false
end
it "should not match if correct Symbol is thrown" do
@matcher.matches?(lambda{ throw :other_sym }).should be_false
@matcher.failure_message.should == "expected :sym, got :other_sym"
end
it "should provide a failure message when no Symbol is thrown" do
@matcher.matches?(lambda{})
@matcher.failure_message.should == "expected :sym but nothing was thrown"
end
it "should provide a failure message when wrong Symbol is thrown" do
@matcher.matches?(lambda{ throw :other_sym })
@matcher.failure_message.should == "expected :sym, got :other_sym"
end
it "should provide a negative failure message" do
@matcher.matches?(lambda{ throw :sym })
@matcher.negative_failure_message.should == "expected :sym not to be thrown"
end
it "should only match NameErrors raised by uncaught throws" do
@matcher.matches?(lambda{ sym }).should be_false
end
end
end
end

View file

@ -0,0 +1,29 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Mocks
describe "AnyNumberOfTimes" do
before(:each) do
@mock = Mock.new("test mock")
end
it "should pass if any number of times method is called many times" do
@mock.should_receive(:random_call).any_number_of_times
(1..10).each do
@mock.random_call
end
end
it "should pass if any number of times method is called once" do
@mock.should_receive(:random_call).any_number_of_times
@mock.random_call
end
it "should pass if any number of times method is not called" do
@mock.should_receive(:random_call).any_number_of_times
end
end
end
end

View file

@ -0,0 +1,23 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Mocks
describe ArgumentExpectation do
it "should consider an object that responds to #matches? and #description to be a matcher" do
argument_expecatation = Spec::Mocks::ArgumentExpectation.new([])
obj = mock("matcher")
obj.should_receive(:respond_to?).with(:matches?).and_return(true)
obj.should_receive(:respond_to?).with(:description).and_return(true)
argument_expecatation.is_matcher?(obj).should be_true
end
it "should NOT consider an object that only responds to #matches? to be a matcher" do
argument_expecatation = Spec::Mocks::ArgumentExpectation.new([])
obj = mock("matcher")
obj.should_receive(:respond_to?).with(:matches?).and_return(true)
obj.should_receive(:respond_to?).with(:description).and_return(false)
argument_expecatation.is_matcher?(obj).should be_false
end
end
end
end

View file

@ -0,0 +1,97 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Mocks
describe "at_least" do
before(:each) do
@mock = Mock.new("test mock")
end
it "should fail if method is never called" do
@mock.should_receive(:random_call).at_least(4).times
lambda do
@mock.rspec_verify
end.should raise_error(MockExpectationError)
end
it "should fail when called less than n times" do
@mock.should_receive(:random_call).at_least(4).times
@mock.random_call
@mock.random_call
@mock.random_call
lambda do
@mock.rspec_verify
end.should raise_error(MockExpectationError)
end
it "should fail when at least once method is never called" do
@mock.should_receive(:random_call).at_least(:once)
lambda do
@mock.rspec_verify
end.should raise_error(MockExpectationError)
end
it "should fail when at least twice method is called once" do
@mock.should_receive(:random_call).at_least(:twice)
@mock.random_call
lambda do
@mock.rspec_verify
end.should raise_error(MockExpectationError)
end
it "should fail when at least twice method is never called" do
@mock.should_receive(:random_call).at_least(:twice)
lambda do
@mock.rspec_verify
end.should raise_error(MockExpectationError)
end
it "should pass when at least n times method is called exactly n times" do
@mock.should_receive(:random_call).at_least(4).times
@mock.random_call
@mock.random_call
@mock.random_call
@mock.random_call
@mock.rspec_verify
end
it "should pass when at least n times method is called n plus 1 times" do
@mock.should_receive(:random_call).at_least(4).times
@mock.random_call
@mock.random_call
@mock.random_call
@mock.random_call
@mock.random_call
@mock.rspec_verify
end
it "should pass when at least once method is called once" do
@mock.should_receive(:random_call).at_least(:once)
@mock.random_call
@mock.rspec_verify
end
it "should pass when at least once method is called twice" do
@mock.should_receive(:random_call).at_least(:once)
@mock.random_call
@mock.random_call
@mock.rspec_verify
end
it "should pass when at least twice method is called three times" do
@mock.should_receive(:random_call).at_least(:twice)
@mock.random_call
@mock.random_call
@mock.random_call
@mock.rspec_verify
end
it "should pass when at least twice method is called twice" do
@mock.should_receive(:random_call).at_least(:twice)
@mock.random_call
@mock.random_call
@mock.rspec_verify
end
end
end
end

View file

@ -0,0 +1,93 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Mocks
describe "at_most" do
before(:each) do
@mock = Mock.new("test mock")
end
it "should fail when at most n times method is called n plus 1 times" do
@mock.should_receive(:random_call).at_most(4).times
@mock.random_call
@mock.random_call
@mock.random_call
@mock.random_call
@mock.random_call
lambda do
@mock.rspec_verify
end.should raise_error(MockExpectationError)
end
it "should fail when at most once method is called twice" do
@mock.should_receive(:random_call).at_most(:once)
@mock.random_call
@mock.random_call
lambda do
@mock.rspec_verify
end.should raise_error(MockExpectationError)
end
it "should fail when at most twice method is called three times" do
@mock.should_receive(:random_call).at_most(:twice)
@mock.random_call
@mock.random_call
@mock.random_call
lambda do
@mock.rspec_verify
end.should raise_error(MockExpectationError)
end
it "should pass when at most n times method is called exactly n times" do
@mock.should_receive(:random_call).at_most(4).times
@mock.random_call
@mock.random_call
@mock.random_call
@mock.random_call
@mock.rspec_verify
end
it "should pass when at most n times method is called less than n times" do
@mock.should_receive(:random_call).at_most(4).times
@mock.random_call
@mock.random_call
@mock.random_call
@mock.rspec_verify
end
it "should pass when at most n times method is never called" do
@mock.should_receive(:random_call).at_most(4).times
@mock.rspec_verify
end
it "should pass when at most once method is called once" do
@mock.should_receive(:random_call).at_most(:once)
@mock.random_call
@mock.rspec_verify
end
it "should pass when at most once method is never called" do
@mock.should_receive(:random_call).at_most(:once)
@mock.rspec_verify
end
it "should pass when at most twice method is called once" do
@mock.should_receive(:random_call).at_most(:twice)
@mock.random_call
@mock.rspec_verify
end
it "should pass when at most twice method is called twice" do
@mock.should_receive(:random_call).at_most(:twice)
@mock.random_call
@mock.random_call
@mock.rspec_verify
end
it "should pass when at most twice method is never called" do
@mock.should_receive(:random_call).at_most(:twice)
@mock.rspec_verify
end
end
end
end

View file

@ -0,0 +1,8 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
describe "An RSpec Mock" do
it "should hide internals in its inspect representation" do
m = mock('cup')
m.inspect.should =~ /#<Spec::Mocks::Mock:0x[a-f0-9.]+ @name="cup">/
end
end

View file

@ -0,0 +1,24 @@
describe "Mock" do
before do
@mock = mock("test mock")
end
specify "when one example has an expectation (non-mock) inside the block passed to the mock" do
@mock.should_receive(:msg) do |b|
b.should be_true #this call exposes the problem
end
@mock.msg(false) rescue nil
end
specify "then the next example should behave as expected instead of saying" do
@mock.should_receive(:foobar)
@mock.foobar
@mock.rspec_verify
begin
@mock.foobar
rescue Exception => e
e.message.should == "Mock 'test mock' received unexpected message :foobar with (no args)"
end
end
end

View file

@ -0,0 +1,33 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
class LiarLiarPantsOnFire
include Spec::MetaClass
extend Spec::MetaClass
def respond_to?(sym)
true
end
def self.respond_to?(sym)
true
end
end
describe 'should_receive' do
before(:each) do
@liar = LiarLiarPantsOnFire.new
end
it "should work when object lies about responding to a method" do
@liar.should_receive(:something)
@liar.something
end
it 'should work when class lies about responding to a method' do
LiarLiarPantsOnFire.should_receive(:something)
LiarLiarPantsOnFire.something
end
it 'should cleanup after itself' do
LiarLiarPantsOnFire.metaclass.instance_methods.should_not include("something")
end
end

View file

@ -0,0 +1,30 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Mocks
describe "mock failure" do
it "should tell you when it receives the right message with the wrong args" do
m = mock("foo")
m.should_receive(:bar).with("message")
lambda {
m.bar("different message")
}.should raise_error(Spec::Mocks::MockExpectationError, %Q{Mock 'foo' expected :bar with ("message") but received it with ("different message")})
m.bar("message") # allows the spec to pass
end
it "should tell you when it receives the right message with the wrong args if you stub the method" do
pending("fix bug 15719")
# NOTE - for whatever reason, if you use a the block style of pending here,
# rcov gets unhappy. Don't know why yet.
m = mock("foo")
m.stub!(:bar)
m.should_receive(:bar).with("message")
lambda {
m.bar("different message")
}.should raise_error(Spec::Mocks::MockExpectationError, %Q{Mock 'foo' expected :bar with ("message") but received it with ("different message")})
m.bar("message") # allows the spec to pass
end
end
end
end

View file

@ -0,0 +1,19 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Bug7611
class Foo
end
class Bar < Foo
end
describe "A Partial Mock" do
it "should respect subclasses" do
Foo.stub!(:new).and_return(Object.new)
end
it "should" do
Bar.new.class.should == Bar
end
end
end

View file

@ -0,0 +1,22 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Bug7805
#This is really a duplicate of 8302
describe "Stubs should correctly restore module methods" do
it "1 - stub the open method" do
File.stub!(:open).and_return("something")
File.open.should == "something"
end
it "2 - use File.open to create example.txt" do
filename = "#{File.dirname(__FILE__)}/example-#{Time.new.to_i}.txt"
File.exist?(filename).should be_false
file = File.open(filename,'w')
file.close
File.exist?(filename).should be_true
File.delete(filename)
File.exist?(filename).should be_false
end
end
end

View file

@ -0,0 +1,31 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
describe "An object where respond_to? is true and does not have method" do
# When should_receive(:sym) is sent to any object, the Proxy sends
# respond_to?(:sym) to that object to see if the method should be proxied.
#
# If respond_to? itself is proxied, then when the Proxy sends respond_to?
# to the object, the proxy is invoked and responds yes (if so set in the spec).
# When the object does NOT actually respond to :sym, an exception is thrown
# when trying to proxy it.
#
# The fix was to keep track of whether :respond_to? had been proxied and, if
# so, call the munged copy of :respond_to? on the object.
it "should not raise an exception for Object" do
obj = Object.new
obj.should_receive(:respond_to?).with(:foobar).and_return(true)
obj.should_receive(:foobar).and_return(:baz)
obj.respond_to?(:foobar).should be_true
obj.foobar.should == :baz
end
it "should not raise an exception for mock" do
obj = mock("obj")
obj.should_receive(:respond_to?).with(:foobar).and_return(true)
obj.should_receive(:foobar).and_return(:baz)
obj.respond_to?(:foobar).should be_true
obj.foobar.should == :baz
end
end

View file

@ -0,0 +1,26 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Bug8302
class Foo
def Foo.class_method(arg)
end
def instance_bar(arg)
end
end
describe "Bug report 8302:" do
it "class method is not restored correctly when proxied" do
Foo.should_not_receive(:class_method).with(Array.new)
Foo.rspec_verify
Foo.class_method(Array.new)
end
it "instance method is not restored correctly when proxied" do
foo = Foo.new
foo.should_not_receive(:instance_bar).with(Array.new)
foo.rspec_verify
foo.instance_bar(Array.new)
end
end
end

View file

@ -0,0 +1,130 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Mocks
describe "failing MockArgumentConstraints" do
before(:each) do
@mock = mock("test mock")
@reporter = Mock.new("reporter", :null_object => true)
end
after(:each) do
@mock.rspec_reset
end
it "should reject non boolean" do
@mock.should_receive(:random_call).with(boolean())
lambda do
@mock.random_call("false")
end.should raise_error(MockExpectationError)
end
it "should reject non numeric" do
@mock.should_receive(:random_call).with(an_instance_of(Numeric))
lambda do
@mock.random_call("1")
end.should raise_error(MockExpectationError)
end
it "should reject non string" do
@mock.should_receive(:random_call).with(an_instance_of(String))
lambda do
@mock.random_call(123)
end.should raise_error(MockExpectationError)
end
it "should reject goose when expecting a duck" do
@mock.should_receive(:random_call).with(duck_type(:abs, :div))
lambda { @mock.random_call("I don't respond to :abs or :div") }.should raise_error(MockExpectationError)
end
it "should fail if regexp does not match submitted string" do
@mock.should_receive(:random_call).with(/bcd/)
lambda { @mock.random_call("abc") }.should raise_error(MockExpectationError)
end
it "should fail if regexp does not match submitted regexp" do
@mock.should_receive(:random_call).with(/bcd/)
lambda { @mock.random_call(/bcde/) }.should raise_error(MockExpectationError)
end
it "should fail for a hash w/ wrong values" do
@mock.should_receive(:random_call).with(:a => "b", :c => "d")
lambda do
@mock.random_call(:a => "b", :c => "e")
end.should raise_error(MockExpectationError, /Mock 'test mock' expected :random_call with \(\{(:a=>\"b\", :c=>\"d\"|:c=>\"d\", :a=>\"b\")\}\) but received it with \(\{(:a=>\"b\", :c=>\"e\"|:c=>\"e\", :a=>\"b\")\}\)/)
end
it "should fail for a hash w/ wrong keys" do
@mock.should_receive(:random_call).with(:a => "b", :c => "d")
lambda do
@mock.random_call("a" => "b", "c" => "d")
end.should raise_error(MockExpectationError, /Mock 'test mock' expected :random_call with \(\{(:a=>\"b\", :c=>\"d\"|:c=>\"d\", :a=>\"b\")\}\) but received it with \(\{(\"a\"=>\"b\", \"c\"=>\"d\"|\"c\"=>\"d\", \"a\"=>\"b\")\}\)/)
end
it "should match against a Matcher" do
lambda do
@mock.should_receive(:msg).with(equal(3))
@mock.msg(37)
end.should raise_error(MockExpectationError, "Mock 'test mock' expected :msg with (equal 3) but received it with (37)")
end
it "should fail no_args with one arg" do
lambda do
@mock.should_receive(:msg).with(no_args)
@mock.msg(37)
end.should raise_error(MockExpectationError, "Mock 'test mock' expected :msg with (no args) but received it with (37)")
end
it "should fail hash_including with missing key" do
lambda do
@mock.should_receive(:msg).with(hash_including(:a => 1))
@mock.msg({})
end.should raise_error(MockExpectationError, "Mock 'test mock' expected :msg with (hash_including(:a=>1)) but received it with ({})")
end
it "should fail with block constraints" do
lambda do
@mock.should_receive(:msg).with {|arg| arg.should == :received }
@mock.msg :no_msg_for_you
end.should raise_error(Spec::Expectations::ExpectationNotMetError, /expected: :received.*\s*.*got: :no_msg_for_you/)
end
end
describe "failing deprecated MockArgumentConstraints" do
before(:each) do
@mock = mock("test mock")
@reporter = Mock.new("reporter", :null_object => true)
Kernel.stub!(:warn)
end
after(:each) do
@mock.rspec_reset
end
it "should reject non boolean" do
@mock.should_receive(:random_call).with(:boolean)
lambda do
@mock.random_call("false")
end.should raise_error(MockExpectationError)
end
it "should reject non numeric" do
@mock.should_receive(:random_call).with(:numeric)
lambda do
@mock.random_call("1")
end.should raise_error(MockExpectationError)
end
it "should reject non string" do
@mock.should_receive(:random_call).with(:string)
lambda do
@mock.random_call(123)
end.should raise_error(MockExpectationError)
end
end
end
end

View file

@ -0,0 +1,32 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Mocks
describe HashIncludingConstraint do
it "should match the same hash" do
hash_including(:a => 1).matches?(:a => 1).should be_true
end
it "should not match a non-hash" do
hash_including(:a => 1).matches?(1).should_not be_true
end
it "should match a hash with extra stuff" do
hash_including(:a => 1).matches?(:a => 1, :b => 2).should be_true
end
it "should not match a hash with a missing key" do
hash_including(:a => 1).matches?(:b => 2).should_not be_true
end
it "should not match a hash with an incorrect value" do
hash_including(:a => 1, :b => 2).matches?(:a => 1, :b => 3).should_not be_true
end
it "should describe itself properly" do
HashIncludingConstraint.new(:a => 1).description.should == "hash_including(:a=>1)"
end
end
end
end

View file

@ -0,0 +1,84 @@
require File.dirname(__FILE__) + '/../../spec_helper'
module Spec
module Mocks
describe "Mock ordering" do
before do
@mock = mock("test mock")
end
after do
@mock.rspec_reset
end
it "should pass two calls in order" do
@mock.should_receive(:one).ordered
@mock.should_receive(:two).ordered
@mock.one
@mock.two
@mock.rspec_verify
end
it "should pass three calls in order" do
@mock.should_receive(:one).ordered
@mock.should_receive(:two).ordered
@mock.should_receive(:three).ordered
@mock.one
@mock.two
@mock.three
@mock.rspec_verify
end
it "should fail if second call comes first" do
@mock.should_receive(:one).ordered
@mock.should_receive(:two).ordered
lambda do
@mock.two
end.should raise_error(MockExpectationError, "Mock 'test mock' received :two out of order")
end
it "should fail if third call comes first" do
@mock.should_receive(:one).ordered
@mock.should_receive(:two).ordered
@mock.should_receive(:three).ordered
@mock.one
lambda do
@mock.three
end.should raise_error(MockExpectationError, "Mock 'test mock' received :three out of order")
end
it "should fail if third call comes second" do
@mock.should_receive(:one).ordered
@mock.should_receive(:two).ordered
@mock.should_receive(:three).ordered
@mock.one
lambda do
@mock.three
end.should raise_error(MockExpectationError, "Mock 'test mock' received :three out of order")
end
it "should ignore order of non ordered calls" do
@mock.should_receive(:ignored_0)
@mock.should_receive(:ordered_1).ordered
@mock.should_receive(:ignored_1)
@mock.should_receive(:ordered_2).ordered
@mock.should_receive(:ignored_2)
@mock.should_receive(:ignored_3)
@mock.should_receive(:ordered_3).ordered
@mock.should_receive(:ignored_4)
@mock.ignored_3
@mock.ordered_1
@mock.ignored_0
@mock.ordered_2
@mock.ignored_4
@mock.ignored_2
@mock.ordered_3
@mock.ignored_1
@mock.rspec_verify
end
end
end
end

View file

@ -0,0 +1,54 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
require 'spec/mocks'
module Spec
module Mocks
describe Space do
before :each do
@space = Space.new
klazz = Class.new do
def rspec_verify
@verified = true
end
def verified?
@verified
end
def rspec_reset
@reset = true
end
def reset?
@reset
end
end
@m1 = klazz.new
@m2 = klazz.new
end
it "should verify all mocks within" do
@space.add(@m1)
@space.add(@m2)
@space.verify_all
@m1.should be_verified
@m2.should be_verified
end
it "should reset all mocks within" do
@space.add(m1 = mock("mock1"))
@space.add(m2 = mock("mock2"))
m1.should_receive(:rspec_reset)
m2.should_receive(:rspec_reset)
@space.reset_all
end
it "should clear internal mocks on reset_all" do
@space.add(m = mock("mock"))
@space.reset_all
@space.instance_eval { mocks.empty? }.should be_true
end
it "should only add an instance once" do
@space.add(m1 = mock("mock1"))
@space.add(m1)
m1.should_receive(:rspec_verify)
@space.verify_all
end
end
end
end

View file

@ -0,0 +1,494 @@
require File.dirname(__FILE__) + '/../../spec_helper'
module Spec
module Mocks
describe Mock do
before(:each) do
@mock = mock("test mock")
end
after(:each) do
@mock.rspec_reset
end
it "should report line number of expectation of unreceived message" do
expected_error_line = __LINE__; @mock.should_receive(:wont_happen).with("x", 3)
begin
@mock.rspec_verify
violated
rescue MockExpectationError => e
# NOTE - this regexp ended w/ $, but jruby adds extra info at the end of the line
e.backtrace[0].should match(/#{File.basename(__FILE__)}:#{expected_error_line}/)
end
end
it "should pass when not receiving message specified as not to be received" do
@mock.should_not_receive(:not_expected)
@mock.rspec_verify
end
it "should pass when receiving message specified as not to be received with different args" do
@mock.should_not_receive(:message).with("unwanted text")
@mock.should_receive(:message).with("other text")
@mock.message "other text"
@mock.rspec_verify
end
it "should fail when receiving message specified as not to be received" do
@mock.should_not_receive(:not_expected)
lambda {
@mock.not_expected
violated
}.should raise_error(MockExpectationError, "Mock 'test mock' expected :not_expected with (no args) 0 times, but received it once")
end
it "should fail when receiving message specified as not to be received with args" do
@mock.should_not_receive(:not_expected).with("unexpected text")
lambda {
@mock.not_expected("unexpected text")
violated
}.should raise_error(MockExpectationError, "Mock 'test mock' expected :not_expected with (\"unexpected text\") 0 times, but received it once")
end
it "should pass when receiving message specified as not to be received with wrong args" do
@mock.should_not_receive(:not_expected).with("unexpected text")
@mock.not_expected "really unexpected text"
@mock.rspec_verify
end
it "should allow block to calculate return values" do
@mock.should_receive(:something).with("a","b","c").and_return { |a,b,c| c+b+a }
@mock.something("a","b","c").should == "cba"
@mock.rspec_verify
end
it "should allow parameter as return value" do
@mock.should_receive(:something).with("a","b","c").and_return("booh")
@mock.something("a","b","c").should == "booh"
@mock.rspec_verify
end
it "should return nil if no return value set" do
@mock.should_receive(:something).with("a","b","c")
@mock.something("a","b","c").should be_nil
@mock.rspec_verify
end
it "should raise exception if args don't match when method called" do
@mock.should_receive(:something).with("a","b","c").and_return("booh")
lambda {
@mock.something("a","d","c")
violated
}.should raise_error(MockExpectationError, "Mock 'test mock' expected :something with (\"a\", \"b\", \"c\") but received it with (\"a\", \"d\", \"c\")")
end
it "should raise exception if args don't match when method called even when the method is stubbed" do
@mock.stub!(:something)
@mock.should_receive(:something).with("a","b","c")
lambda {
@mock.something("a","d","c")
@mock.rspec_verify
}.should raise_error(MockExpectationError, "Mock 'test mock' expected :something with (\"a\", \"b\", \"c\") but received it with (\"a\", \"d\", \"c\")")
end
it "should raise exception if args don't match when method called even when using null_object" do
@mock = mock("test mock", :null_object => true)
@mock.should_receive(:something).with("a","b","c")
lambda {
@mock.something("a","d","c")
@mock.rspec_verify
}.should raise_error(MockExpectationError, "Mock 'test mock' expected :something with (\"a\", \"b\", \"c\") but received it with (\"a\", \"d\", \"c\")")
end
it "should fail if unexpected method called" do
lambda {
@mock.something("a","b","c")
violated
}.should raise_error(MockExpectationError, "Mock 'test mock' received unexpected message :something with (\"a\", \"b\", \"c\")")
end
it "should use block for expectation if provided" do
@mock.should_receive(:something) do | a, b |
a.should == "a"
b.should == "b"
"booh"
end
@mock.something("a", "b").should == "booh"
@mock.rspec_verify
end
it "should fail if expectation block fails" do
@mock.should_receive(:something) {| bool | bool.should be_true}
lambda {
@mock.something false
}.should raise_error(MockExpectationError, /Mock 'test mock' received :something but passed block failed with: expected true, got false/)
end
it "should fail right away when method defined as never is received" do
@mock.should_receive(:not_expected).never
lambda {
@mock.not_expected
}.should raise_error(MockExpectationError, "Mock 'test mock' expected :not_expected with (no args) 0 times, but received it once")
end
it "should eventually fail when method defined as never is received" do
@mock.should_receive(:not_expected).never
lambda {
@mock.not_expected
}.should raise_error(MockExpectationError, "Mock 'test mock' expected :not_expected with (no args) 0 times, but received it once")
end
it "should raise when told to" do
@mock.should_receive(:something).and_raise(RuntimeError)
lambda do
@mock.something
end.should raise_error(RuntimeError)
end
it "should raise passed an Exception instance" do
error = RuntimeError.new("error message")
@mock.should_receive(:something).and_raise(error)
lambda {
@mock.something
}.should raise_error(RuntimeError, "error message")
end
it "should raise RuntimeError with passed message" do
@mock.should_receive(:something).and_raise("error message")
lambda {
@mock.something
}.should raise_error(RuntimeError, "error message")
end
it "should not raise when told to if args dont match" do
@mock.should_receive(:something).with(2).and_raise(RuntimeError)
lambda {
@mock.something 1
}.should raise_error(MockExpectationError)
end
it "should throw when told to" do
@mock.should_receive(:something).and_throw(:blech)
lambda {
@mock.something
}.should throw_symbol(:blech)
end
it "should raise when explicit return and block constrained" do
lambda {
@mock.should_receive(:fruit) do |colour|
:strawberry
end.and_return :apple
}.should raise_error(AmbiguousReturnError)
end
it "should ignore args on any args" do
@mock.should_receive(:something).at_least(:once).with(any_args)
@mock.something
@mock.something 1
@mock.something "a", 2
@mock.something [], {}, "joe", 7
@mock.rspec_verify
end
it "should fail on no args if any args received" do
@mock.should_receive(:something).with(no_args())
lambda {
@mock.something 1
}.should raise_error(MockExpectationError, "Mock 'test mock' expected :something with (no args) but received it with (1)")
end
it "should fail when args are expected but none are received" do
@mock.should_receive(:something).with(1)
lambda {
@mock.something
}.should raise_error(MockExpectationError, "Mock 'test mock' expected :something with (1) but received it with (no args)")
end
it "should return value from block by default" do
@mock.stub!(:method_that_yields).and_yield
@mock.method_that_yields { :returned_obj }.should == :returned_obj
@mock.rspec_verify
end
it "should yield 0 args to blocks that take a variable number of arguments" do
@mock.should_receive(:yield_back).with(no_args()).once.and_yield
a = nil
@mock.yield_back {|*a|}
a.should == []
@mock.rspec_verify
end
it "should yield 0 args multiple times to blocks that take a variable number of arguments" do
@mock.should_receive(:yield_back).once.with(no_args()).once.and_yield.
and_yield
a = nil
b = []
@mock.yield_back {|*a| b << a}
b.should == [ [], [] ]
@mock.rspec_verify
end
it "should yield one arg to blocks that take a variable number of arguments" do
@mock.should_receive(:yield_back).with(no_args()).once.and_yield(99)
a = nil
@mock.yield_back {|*a|}
a.should == [99]
@mock.rspec_verify
end
it "should yield one arg 3 times consecutively to blocks that take a variable number of arguments" do
@mock.should_receive(:yield_back).once.with(no_args()).once.and_yield(99).
and_yield(43).
and_yield("something fruity")
a = nil
b = []
@mock.yield_back {|*a| b << a}
b.should == [[99], [43], ["something fruity"]]
@mock.rspec_verify
end
it "should yield many args to blocks that take a variable number of arguments" do
@mock.should_receive(:yield_back).with(no_args()).once.and_yield(99, 27, "go")
a = nil
@mock.yield_back {|*a|}
a.should == [99, 27, "go"]
@mock.rspec_verify
end
it "should yield many args 3 times consecutively to blocks that take a variable number of arguments" do
@mock.should_receive(:yield_back).once.with(no_args()).once.and_yield(99, :green, "go").
and_yield("wait", :amber).
and_yield("stop", 12, :red)
a = nil
b = []
@mock.yield_back {|*a| b << a}
b.should == [[99, :green, "go"], ["wait", :amber], ["stop", 12, :red]]
@mock.rspec_verify
end
it "should yield single value" do
@mock.should_receive(:yield_back).with(no_args()).once.and_yield(99)
a = nil
@mock.yield_back {|a|}
a.should == 99
@mock.rspec_verify
end
it "should yield single value 3 times consecutively" do
@mock.should_receive(:yield_back).once.with(no_args()).once.and_yield(99).
and_yield(43).
and_yield("something fruity")
a = nil
b = []
@mock.yield_back {|a| b << a}
b.should == [99, 43, "something fruity"]
@mock.rspec_verify
end
it "should yield two values" do
@mock.should_receive(:yield_back).with(no_args()).once.and_yield('wha', 'zup')
a, b = nil
@mock.yield_back {|a,b|}
a.should == 'wha'
b.should == 'zup'
@mock.rspec_verify
end
it "should yield two values 3 times consecutively" do
@mock.should_receive(:yield_back).once.with(no_args()).once.and_yield('wha', 'zup').
and_yield('not', 'down').
and_yield(14, 65)
a, b = nil
c = []
@mock.yield_back {|a,b| c << [a, b]}
c.should == [['wha', 'zup'], ['not', 'down'], [14, 65]]
@mock.rspec_verify
end
it "should fail when calling yielding method with wrong arity" do
@mock.should_receive(:yield_back).with(no_args()).once.and_yield('wha', 'zup')
lambda {
@mock.yield_back {|a|}
}.should raise_error(MockExpectationError, "Mock 'test mock' yielded |\"wha\", \"zup\"| to block with arity of 1")
end
it "should fail when calling yielding method consecutively with wrong arity" do
@mock.should_receive(:yield_back).once.with(no_args()).once.and_yield('wha', 'zup').
and_yield('down').
and_yield(14, 65)
lambda {
a, b = nil
c = []
@mock.yield_back {|a,b| c << [a, b]}
}.should raise_error(MockExpectationError, "Mock 'test mock' yielded |\"down\"| to block with arity of 2")
end
it "should fail when calling yielding method without block" do
@mock.should_receive(:yield_back).with(no_args()).once.and_yield('wha', 'zup')
lambda {
@mock.yield_back
}.should raise_error(MockExpectationError, "Mock 'test mock' asked to yield |[\"wha\", \"zup\"]| but no block was passed")
end
it "should be able to mock send" do
@mock.should_receive(:send).with(any_args)
@mock.send 'hi'
@mock.rspec_verify
end
it "should be able to raise from method calling yielding mock" do
@mock.should_receive(:yield_me).and_yield 44
lambda {
@mock.yield_me do |x|
raise "Bang"
end
}.should raise_error(StandardError, "Bang")
@mock.rspec_verify
end
it "should clear expectations after verify" do
@mock.should_receive(:foobar)
@mock.foobar
@mock.rspec_verify
lambda {
@mock.foobar
}.should raise_error(MockExpectationError, "Mock 'test mock' received unexpected message :foobar with (no args)")
end
it "should restore objects to their original state on rspec_reset" do
mock = mock("this is a mock")
mock.should_receive(:blah)
mock.rspec_reset
mock.rspec_verify #should throw if reset didn't work
end
it "should work even after method_missing starts raising NameErrors instead of NoMethodErrors" do
# Object#method_missing throws either NameErrors or NoMethodErrors.
#
# On a fresh ruby program Object#method_missing:
# * raises a NoMethodError when called directly
# * raises a NameError when called indirectly
#
# Once Object#method_missing has been called at least once (on any object)
# it starts behaving differently:
# * raises a NameError when called directly
# * raises a NameError when called indirectly
#
# There was a bug in Mock#method_missing that relied on the fact
# that calling Object#method_missing directly raises a NoMethodError.
# This example tests that the bug doesn't exist anymore.
# Ensures that method_missing always raises NameErrors.
a_method_that_doesnt_exist rescue
@mock.should_receive(:foobar)
@mock.foobar
@mock.rspec_verify
lambda { @mock.foobar }.should_not raise_error(NameError)
lambda { @mock.foobar }.should raise_error(MockExpectationError)
end
it "should temporarily replace a method stub on a mock" do
@mock.stub!(:msg).and_return(:stub_value)
@mock.should_receive(:msg).with(:arg).and_return(:mock_value)
@mock.msg(:arg).should equal(:mock_value)
@mock.msg.should equal(:stub_value)
@mock.msg.should equal(:stub_value)
@mock.rspec_verify
end
it "should temporarily replace a method stub on a non-mock" do
non_mock = Object.new
non_mock.stub!(:msg).and_return(:stub_value)
non_mock.should_receive(:msg).with(:arg).and_return(:mock_value)
non_mock.msg(:arg).should equal(:mock_value)
non_mock.msg.should equal(:stub_value)
non_mock.msg.should equal(:stub_value)
non_mock.rspec_verify
end
it "should assign stub return values" do
mock = Mock.new('name', :message => :response)
mock.message.should == :response
end
end
describe "a mock message receiving a block" do
before(:each) do
@mock = mock("mock")
@calls = 0
end
def add_call
@calls = @calls + 1
end
it "should call the block after #should_receive" do
@mock.should_receive(:foo) { add_call }
@mock.foo
@calls.should == 1
end
it "should call the block after #once" do
@mock.should_receive(:foo).once { add_call }
@mock.foo
@calls.should == 1
end
it "should call the block after #twice" do
@mock.should_receive(:foo).twice { add_call }
@mock.foo
@mock.foo
@calls.should == 2
end
it "should call the block after #times" do
@mock.should_receive(:foo).exactly(10).times { add_call }
(1..10).each { @mock.foo }
@calls.should == 10
end
it "should call the block after #any_number_of_times" do
@mock.should_receive(:foo).any_number_of_times { add_call }
(1..7).each { @mock.foo }
@calls.should == 7
end
it "should call the block after #ordered" do
@mock.should_receive(:foo).ordered { add_call }
@mock.should_receive(:bar).ordered { add_call }
@mock.foo
@mock.bar
@calls.should == 2
end
end
describe 'string representation generated by #to_s' do
it 'should not contain < because that might lead to invalid HTML in some situations' do
mock = mock("Dog")
valid_html_str = "#{mock}"
valid_html_str.should_not include('<')
end
end
end
end

View file

@ -0,0 +1,113 @@
require File.dirname(__FILE__) + '/../../spec_helper'
module Spec
module Mocks
describe "a Mock expectation with multiple return values and no specified count" do
before(:each) do
@mock = Mock.new("mock")
@return_values = ["1",2,Object.new]
@mock.should_receive(:message).and_return(@return_values[0],@return_values[1],@return_values[2])
end
it "should return values in order to consecutive calls" do
@mock.message.should == @return_values[0]
@mock.message.should == @return_values[1]
@mock.message.should == @return_values[2]
@mock.rspec_verify
end
it "should complain when there are too few calls" do
third = Object.new
@mock.message.should == @return_values[0]
@mock.message.should == @return_values[1]
lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it twice")
end
it "should complain when there are too many calls" do
third = Object.new
@mock.message.should == @return_values[0]
@mock.message.should == @return_values[1]
@mock.message.should == @return_values[2]
@mock.message.should == @return_values[2]
lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it 4 times")
end
end
describe "a Mock expectation with multiple return values with a specified count equal to the number of values" do
before(:each) do
@mock = Mock.new("mock")
@return_values = ["1",2,Object.new]
@mock.should_receive(:message).exactly(3).times.and_return(@return_values[0],@return_values[1],@return_values[2])
end
it "should return values in order to consecutive calls" do
@mock.message.should == @return_values[0]
@mock.message.should == @return_values[1]
@mock.message.should == @return_values[2]
@mock.rspec_verify
end
it "should complain when there are too few calls" do
third = Object.new
@mock.message.should == @return_values[0]
@mock.message.should == @return_values[1]
lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it twice")
end
it "should complain when there are too many calls" do
third = Object.new
@mock.message.should == @return_values[0]
@mock.message.should == @return_values[1]
@mock.message.should == @return_values[2]
@mock.message.should == @return_values[2]
lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it 4 times")
end
end
describe "a Mock expectation with multiple return values specifying at_least less than the number of values" do
before(:each) do
@mock = Mock.new("mock")
@mock.should_receive(:message).at_least(:twice).with(no_args).and_return(11, 22)
end
it "should use last return value for subsequent calls" do
@mock.message.should equal(11)
@mock.message.should equal(22)
@mock.message.should equal(22)
@mock.rspec_verify
end
it "should fail when called less than the specified number" do
@mock.message.should equal(11)
lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (no args) twice, but received it once")
end
end
describe "a Mock expectation with multiple return values with a specified count larger than the number of values" do
before(:each) do
@mock = Mock.new("mock")
@mock.should_receive(:message).exactly(3).times.and_return(11, 22)
end
it "should use last return value for subsequent calls" do
@mock.message.should equal(11)
@mock.message.should equal(22)
@mock.message.should equal(22)
@mock.rspec_verify
end
it "should fail when called less than the specified number" do
@mock.message.should equal(11)
lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it once")
end
it "should fail when called greater than the specified number" do
@mock.message.should equal(11)
@mock.message.should equal(22)
@mock.message.should equal(22)
@mock.message.should equal(22)
lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it 4 times")
end
end
end
end

View file

@ -0,0 +1,40 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Mocks
describe "a mock acting as a NullObject" do
before(:each) do
@mock = Mock.new("null_object", :null_object => true)
end
it "should allow explicit expectation" do
@mock.should_receive(:something)
@mock.something
end
it "should fail verification when explicit exception not met" do
lambda do
@mock.should_receive(:something)
@mock.rspec_verify
end.should raise_error(MockExpectationError)
end
it "should ignore unexpected methods" do
@mock.random_call("a", "d", "c")
@mock.rspec_verify
end
it "should expected message with different args first" do
@mock.should_receive(:message).with(:expected_arg)
@mock.message(:unexpected_arg)
@mock.message(:expected_arg)
end
it "should expected message with different args second" do
@mock.should_receive(:message).with(:expected_arg)
@mock.message(:expected_arg)
@mock.message(:unexpected_arg)
end
end
end
end

View file

@ -0,0 +1,53 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Mocks
describe "OnceCounts" do
before(:each) do
@mock = mock("test mock")
end
it "once should fail when called once with wrong args" do
@mock.should_receive(:random_call).once.with("a", "b", "c")
lambda do
@mock.random_call("d", "e", "f")
end.should raise_error(MockExpectationError)
@mock.rspec_reset
end
it "once should fail when called twice" do
@mock.should_receive(:random_call).once
@mock.random_call
@mock.random_call
lambda do
@mock.rspec_verify
end.should raise_error(MockExpectationError)
end
it "once should fail when not called" do
@mock.should_receive(:random_call).once
lambda do
@mock.rspec_verify
end.should raise_error(MockExpectationError)
end
it "once should pass when called once" do
@mock.should_receive(:random_call).once
@mock.random_call
@mock.rspec_verify
end
it "once should pass when called once with specified args" do
@mock.should_receive(:random_call).once.with("a", "b", "c")
@mock.random_call("a", "b", "c")
@mock.rspec_verify
end
it "once should pass when called once with unspecified args" do
@mock.should_receive(:random_call).once
@mock.random_call("a", "b", "c")
@mock.rspec_verify
end
end
end
end

View file

@ -0,0 +1,45 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Mocks
describe "calling :should_receive with an options hash" do
it_should_behave_like "sandboxed rspec_options"
attr_reader :reporter, :example_group
before do
@reporter = ::Spec::Runner::Reporter.new(options)
@example_group = Class.new(::Spec::Example::ExampleGroup) do
plugin_mock_framework
describe("Some Examples")
end
reporter.add_example_group example_group
end
it "should report the file and line submitted with :expected_from" do
example_definition = example_group.it "spec" do
mock = Spec::Mocks::Mock.new("a mock")
mock.should_receive(:message, :expected_from => "/path/to/blah.ext:37")
mock.rspec_verify
end
example = example_group.new(example_definition)
reporter.should_receive(:example_finished) do |spec, error|
error.backtrace.detect {|line| line =~ /\/path\/to\/blah.ext:37/}.should_not be_nil
end
example.execute(options, {})
end
it "should use the message supplied with :message" do
example_definition = @example_group.it "spec" do
mock = Spec::Mocks::Mock.new("a mock")
mock.should_receive(:message, :message => "recebi nada")
mock.rspec_verify
end
example = @example_group.new(example_definition)
@reporter.should_receive(:example_finished) do |spec, error|
error.message.should == "recebi nada"
end
example.execute(@options, {})
end
end
end
end

View file

@ -0,0 +1,142 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Mocks
describe "using a Partial Mock," do
before(:each) do
@object = Object.new
end
it "should name the class in the failure message" do
@object.should_receive(:foo)
lambda do
@object.rspec_verify
end.should raise_error(Spec::Mocks::MockExpectationError, /Object/)
end
it "should not conflict with @options in the object" do
@object.instance_eval { @options = Object.new }
@object.should_receive(:blah)
@object.blah
end
it "should_not_receive should mock out the method" do
pending("example raises the expected error, yet fails")
@object.should_not_receive(:fuhbar)
lambda do
@object.fuhbar
end.should raise_error(MockExpectationError, "Mock 'Object' expected :fuhbar with (no args) 0 times, but received it once")
end
it "should_not_receive should return a negative message expectation" do
@object.should_not_receive(:foobar).should be_kind_of(NegativeMessageExpectation)
end
it "should_receive should mock out the method" do
@object.should_receive(:foobar).with(:test_param).and_return(1)
@object.foobar(:test_param).should equal(1)
end
it "should_receive should handle a hash" do
@object.should_receive(:foobar).with(:key => "value").and_return(1)
@object.foobar(:key => "value").should equal(1)
end
it "should_receive should handle an inner hash" do
hash = {:a => {:key => "value"}}
@object.should_receive(:foobar).with(:key => "value").and_return(1)
@object.foobar(hash[:a]).should equal(1)
end
it "should_receive should return a message expectation" do
@object.should_receive(:foobar).should be_kind_of(MessageExpectation)
@object.foobar
end
it "should_receive should verify method was called" do
@object.should_receive(:foobar).with(:test_param).and_return(1)
lambda do
@object.rspec_verify
end.should raise_error(Spec::Mocks::MockExpectationError)
end
it "should_receive should also take a String argument" do
@object.should_receive('foobar')
@object.foobar
end
it "should_not_receive should also take a String argument" do
pending("example raises the expected error, yet fails")
@object.should_not_receive('foobar')
lambda do
@object.foobar
end.should raise_error(Spec::Mocks::MockExpectationError)
end
it "should use report nil in the error message" do
@this_will_resolve_to_nil.should_receive(:foobar)
lambda do
@this_will_resolve_to_nil.rspec_verify
end.should raise_error(Spec::Mocks::MockExpectationError, /NilClass.*expected :foobar with/)
end
end
describe "Partially mocking an object that defines ==, after another mock has been defined" do
before(:each) do
stub("existing mock", :foo => :foo)
end
class PartiallyMockedEquals
attr_reader :val
def initialize(val)
@val = val
end
def ==(other)
@val == other.val
end
end
it "should not raise an error when stubbing the object" do
o = PartiallyMockedEquals.new :foo
lambda { o.stub!(:bar) }.should_not raise_error(NoMethodError)
end
end
describe "Method visibility when using partial mocks" do
class MockableClass
def public_method
private_method
protected_method
end
protected
def protected_method; end
private
def private_method; end
end
before(:each) do
@object = MockableClass.new
end
it 'should keep public methods public' do
@object.should_receive(:public_method)
@object.public_methods.should include('public_method')
@object.public_method
end
it 'should keep private methods private' do
@object.should_receive(:private_method)
@object.private_methods.should include('private_method')
@object.public_method
end
it 'should keep protected methods protected' do
@object.should_receive(:protected_method)
@object.protected_methods.should include('protected_method')
@object.public_method
end
end
end
end

View file

@ -0,0 +1,66 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Mocks
describe "PartialMockUsingMocksDirectly" do
before(:each) do
klass=Class.new
klass.class_eval do
def existing_method
:original_value
end
end
@obj = klass.new
end
# See http://rubyforge.org/tracker/index.php?func=detail&aid=10263&group_id=797&atid=3149
# specify "should clear expectations on verify" do
# @obj.should_receive(:msg)
# @obj.msg
# @obj.rspec_verify
# lambda do
# @obj.msg
# end.should raise_error(NoMethodError)
#
# end
it "should fail when expected message is not received" do
@obj.should_receive(:msg)
lambda do
@obj.rspec_verify
end.should raise_error(MockExpectationError)
end
it "should fail when message is received with incorrect args" do
@obj.should_receive(:msg).with(:correct_arg)
lambda do
@obj.msg(:incorrect_arg)
end.should raise_error(MockExpectationError)
@obj.msg(:correct_arg)
end
it "should pass when expected message is received" do
@obj.should_receive(:msg)
@obj.msg
@obj.rspec_verify
end
it "should pass when message is received with correct args" do
@obj.should_receive(:msg).with(:correct_arg)
@obj.msg(:correct_arg)
@obj.rspec_verify
end
it "should revert to original method if existed" do
@obj.existing_method.should equal(:original_value)
@obj.should_receive(:existing_method).and_return(:mock_value)
@obj.existing_method.should equal(:mock_value)
@obj.rspec_verify
@obj.existing_method.should equal(:original_value)
end
end
end
end

View file

@ -0,0 +1,175 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Mocks
describe "mock argument constraints", :shared => true do
before(:each) do
@mock = Mock.new("test mock")
Kernel.stub!(:warn)
end
after(:each) do
@mock.rspec_verify
end
end
describe Methods, "handling argument constraints with DEPRECATED symbols" do
it_should_behave_like "mock argument constraints"
it "should accept true as boolean" do
@mock.should_receive(:random_call).with(:boolean)
@mock.random_call(true)
end
it "should accept false as boolean" do
@mock.should_receive(:random_call).with(:boolean)
@mock.random_call(false)
end
it "should accept fixnum as numeric" do
@mock.should_receive(:random_call).with(:numeric)
@mock.random_call(1)
end
it "should accept float as numeric" do
@mock.should_receive(:random_call).with(:numeric)
@mock.random_call(1.5)
end
it "should accept string as anything" do
@mock.should_receive(:random_call).with("a", :anything, "c")
@mock.random_call("a", "whatever", "c")
end
it "should match string" do
@mock.should_receive(:random_call).with(:string)
@mock.random_call("a string")
end
it "should match no args against any_args" do
@mock.should_receive(:random_call).with(:any_args)
@mock.random_call("a string")
end
it "should match no args against no_args" do
@mock.should_receive(:random_call).with(:no_args)
@mock.random_call
end
end
describe Methods, "handling argument constraints" do
it_should_behave_like "mock argument constraints"
it "should accept true as boolean()" do
@mock.should_receive(:random_call).with(boolean())
@mock.random_call(true)
end
it "should accept false as boolean()" do
@mock.should_receive(:random_call).with(boolean())
@mock.random_call(false)
end
it "should accept fixnum as an_instance_of(Numeric)" do
@mock.should_receive(:random_call).with(an_instance_of(Numeric))
@mock.random_call(1)
end
it "should accept float as an_instance_of(Numeric)" do
@mock.should_receive(:random_call).with(an_instance_of(Numeric))
@mock.random_call(1.5)
end
it "should accept string as anything()" do
@mock.should_receive(:random_call).with("a", anything(), "c")
@mock.random_call("a", "whatever", "c")
end
it "should match duck type with one method" do
@mock.should_receive(:random_call).with(duck_type(:length))
@mock.random_call([])
end
it "should match duck type with two methods" do
@mock.should_receive(:random_call).with(duck_type(:abs, :div))
@mock.random_call(1)
end
it "should match no args against any_args()" do
@mock.should_receive(:random_call).with(any_args)
@mock.random_call()
end
it "should match one arg against any_args()" do
@mock.should_receive(:random_call).with(any_args)
@mock.random_call("a string")
end
it "should match no args against no_args()" do
@mock.should_receive(:random_call).with(no_args)
@mock.random_call()
end
it "should match hash with hash_including same hash" do
@mock.should_receive(:random_call).with(hash_including(:a => 1))
@mock.random_call(:a => 1)
end
end
describe Methods, "handling block constraints" do
it_should_behave_like "mock argument constraints"
it "should match arguments against RSpec expectations" do
@mock.should_receive(:random_call).with {|arg1, arg2, arr, *rest|
arg1.should == 5
arg2.should have_at_least(3).characters
arg2.should have_at_most(10).characters
arr.map {|i| i * 2}.should == [2,4,6]
rest.should == [:fee, "fi", 4]
}
@mock.random_call 5, "hello", [1,2,3], :fee, "fi", 4
end
end
describe Methods, "handling non-constraint arguments" do
it "should match non special symbol (can be removed when deprecated symbols are removed)" do
@mock.should_receive(:random_call).with(:some_symbol)
@mock.random_call(:some_symbol)
end
it "should match string against regexp" do
@mock.should_receive(:random_call).with(/bcd/)
@mock.random_call("abcde")
end
it "should match regexp against regexp" do
@mock.should_receive(:random_call).with(/bcd/)
@mock.random_call(/bcd/)
end
it "should match against a hash submitted and received by value" do
@mock.should_receive(:random_call).with(:a => "a", :b => "b")
@mock.random_call(:a => "a", :b => "b")
end
it "should match against a hash submitted by reference and received by value" do
opts = {:a => "a", :b => "b"}
@mock.should_receive(:random_call).with(opts)
@mock.random_call(:a => "a", :b => "b")
end
it "should match against a hash submitted by value and received by reference" do
opts = {:a => "a", :b => "b"}
@mock.should_receive(:random_call).with(:a => "a", :b => "b")
@mock.random_call(opts)
end
it "should match against a Matcher" do
@mock.should_receive(:msg).with(equal(37))
@mock.msg(37)
end
end
end
end

View file

@ -0,0 +1,52 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Mocks
describe "PreciseCounts" do
before(:each) do
@mock = mock("test mock")
end
it "should fail when exactly n times method is called less than n times" do
@mock.should_receive(:random_call).exactly(3).times
@mock.random_call
@mock.random_call
lambda do
@mock.rspec_verify
end.should raise_error(MockExpectationError)
end
it "should fail when exactly n times method is never called" do
@mock.should_receive(:random_call).exactly(3).times
lambda do
@mock.rspec_verify
end.should raise_error(MockExpectationError)
end
it "should pass if exactly n times method is called exactly n times" do
@mock.should_receive(:random_call).exactly(3).times
@mock.random_call
@mock.random_call
@mock.random_call
@mock.rspec_verify
end
it "should pass multiple calls with different args and counts" do
@mock.should_receive(:random_call).twice.with(1)
@mock.should_receive(:random_call).once.with(2)
@mock.random_call(1)
@mock.random_call(2)
@mock.random_call(1)
@mock.rspec_verify
end
it "should pass mutiple calls with different args" do
@mock.should_receive(:random_call).once.with(1)
@mock.should_receive(:random_call).once.with(2)
@mock.random_call(1)
@mock.random_call(2)
@mock.rspec_verify
end
end
end
end

View file

@ -0,0 +1,26 @@
require File.dirname(__FILE__) + '/../../spec_helper'
module Spec
module Mocks
describe "a mock" do
before(:each) do
@mock = mock("mock", :null_object => true)
end
it "should answer false for received_message? when no messages received" do
@mock.received_message?(:message).should be_false
end
it "should answer true for received_message? when message received" do
@mock.message
@mock.received_message?(:message).should be_true
end
it "should answer true for received_message? when message received with correct args" do
@mock.message 1,2,3
@mock.received_message?(:message, 1,2,3).should be_true
end
it "should answer false for received_message? when message received with incorrect args" do
@mock.message 1,2,3
@mock.received_message?(:message, 1,2).should be_false
end
end
end
end

View file

@ -0,0 +1,181 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Mocks
describe "A method stub" do
before(:each) do
@class = Class.new do
def self.existing_class_method
:original_value
end
def existing_instance_method
:original_value
end
end
@instance = @class.new
end
it "should return expected value when expected message is received" do
@instance.stub!(:msg).and_return(:return_value)
@instance.msg.should equal(:return_value)
@instance.rspec_verify
end
it "should ignore when expected message is received" do
@instance.stub!(:msg)
@instance.msg
lambda do
@instance.rspec_verify
end.should_not raise_error
end
it "should ignore when message is received with args" do
@instance.stub!(:msg)
@instance.msg(:an_arg)
lambda do
@instance.rspec_verify
end.should_not raise_error
end
it "should ignore when expected message is not received" do
@instance.stub!(:msg)
lambda do
@instance.rspec_verify
end.should_not raise_error
end
it "should clear itself when verified" do
@instance.stub!(:this_should_go).and_return(:blah)
@instance.this_should_go.should == :blah
@instance.rspec_verify
lambda do
@instance.this_should_go
end.should raise_error(NameError)
end
it "should return values in order to consecutive calls" do
return_values = ["1",2,Object.new]
@instance.stub!(:msg).and_return(return_values[0],return_values[1],return_values[2])
@instance.msg.should == return_values[0]
@instance.msg.should == return_values[1]
@instance.msg.should == return_values[2]
end
it "should keep returning last value in consecutive calls" do
return_values = ["1",2,Object.new]
@instance.stub!(:msg).and_return(return_values[0],return_values[1],return_values[2])
@instance.msg.should == return_values[0]
@instance.msg.should == return_values[1]
@instance.msg.should == return_values[2]
@instance.msg.should == return_values[2]
@instance.msg.should == return_values[2]
end
it "should revert to original instance method if there is one" do
@instance.existing_instance_method.should equal(:original_value)
@instance.stub!(:existing_instance_method).and_return(:mock_value)
@instance.existing_instance_method.should equal(:mock_value)
@instance.rspec_verify
@instance.existing_instance_method.should equal(:original_value)
end
it "should revert to original class method if there is one" do
@class.existing_class_method.should equal(:original_value)
@class.stub!(:existing_class_method).and_return(:mock_value)
@class.existing_class_method.should equal(:mock_value)
@class.rspec_verify
@class.existing_class_method.should equal(:original_value)
end
it "should yield a specified object" do
@instance.stub!(:method_that_yields).and_yield(:yielded_obj)
current_value = :value_before
@instance.method_that_yields {|val| current_value = val}
current_value.should == :yielded_obj
@instance.rspec_verify
end
it "should yield multiple times with multiple calls to and_yield" do
@instance.stub!(:method_that_yields_multiple_times).and_yield(:yielded_value).
and_yield(:another_value)
current_value = []
@instance.method_that_yields_multiple_times {|val| current_value << val}
current_value.should == [:yielded_value, :another_value]
@instance.rspec_verify
end
it "should yield a specified object and return another specified object" do
yielded_obj = mock("my mock")
yielded_obj.should_receive(:foo).with(:bar)
@instance.stub!(:method_that_yields_and_returns).and_yield(yielded_obj).and_return(:baz)
@instance.method_that_yields_and_returns { |o| o.foo :bar }.should == :baz
end
it "should throw when told to" do
@mock.stub!(:something).and_throw(:up)
lambda do
@mock.something
end.should throw_symbol(:up)
end
it "should override a pre-existing stub" do
@stub.stub!(:existing_instance_method).and_return(:updated_stub_value)
@stub.existing_instance_method.should == :updated_stub_value
end
it "should limit " do
@stub.stub!(:foo).with("bar")
@stub.should_receive(:foo).with("baz")
@stub.foo("bar")
@stub.foo("baz")
end
end
describe "A method stub with args" do
before(:each) do
@stub = Object.new
@stub.stub!(:foo).with("bar")
end
it "should not complain if not called" do
end
it "should not complain if called with arg" do
@stub.foo("bar")
end
it "should complain if called with no arg" do
lambda do
@stub.foo
end.should raise_error
end
it "should complain if called with other arg" do
lambda do
@stub.foo("other")
end.should raise_error
end
it "should not complain if also mocked w/ different args" do
@stub.should_receive(:foo).with("baz")
@stub.foo("bar")
@stub.foo("baz")
end
it "should complain if also mocked w/ different args AND called w/ a 3rd set of args" do
@stub.should_receive(:foo).with("baz")
@stub.foo("bar")
@stub.foo("baz")
lambda do
@stub.foo("other")
end.should raise_error
end
it "should support options" do
@stub.stub!(:foo, :expected_from => "bar")
end
end
end
end

View file

@ -0,0 +1,67 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Mocks
describe "TwiceCounts" do
before(:each) do
@mock = mock("test mock")
end
it "twice should fail when call count is higher than expected" do
@mock.should_receive(:random_call).twice
@mock.random_call
@mock.random_call
@mock.random_call
lambda do
@mock.rspec_verify
end.should raise_error(MockExpectationError)
end
it "twice should fail when call count is lower than expected" do
@mock.should_receive(:random_call).twice
@mock.random_call
lambda do
@mock.rspec_verify
end.should raise_error(MockExpectationError)
end
it "twice should fail when called twice with wrong args on the first call" do
@mock.should_receive(:random_call).twice.with("1", 1)
lambda do
@mock.random_call(1, "1")
end.should raise_error(MockExpectationError)
@mock.rspec_reset
end
it "twice should fail when called twice with wrong args on the second call" do
@mock.should_receive(:random_call).twice.with("1", 1)
@mock.random_call("1", 1)
lambda do
@mock.random_call(1, "1")
end.should raise_error(MockExpectationError)
@mock.rspec_reset
end
it "twice should pass when called twice" do
@mock.should_receive(:random_call).twice
@mock.random_call
@mock.random_call
@mock.rspec_verify
end
it "twice should pass when called twice with specified args" do
@mock.should_receive(:random_call).twice.with("1", 1)
@mock.random_call("1", 1)
@mock.random_call("1", 1)
@mock.rspec_verify
end
it "twice should pass when called twice with unspecified args" do
@mock.should_receive(:random_call).twice
@mock.random_call("1")
@mock.random_call(1)
@mock.rspec_verify
end
end
end
end

View file

@ -0,0 +1,14 @@
require File.dirname(__FILE__) + '/../../spec_helper'
require File.dirname(__FILE__) + '/../../ruby_forker'
describe "The bin/spec script" do
include RubyForker
it "should have no warnings" do
pending "Hangs on JRuby" if PLATFORM =~ /java/
spec_path = "#{File.dirname(__FILE__)}/../../../bin/spec"
output = ruby "-w #{spec_path} --help 2>&1"
output.should_not =~ /warning/n
end
end

View file

@ -0,0 +1,23 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Runner
describe ClassAndArgumentsParser, ".parse" do
it "should use a single : to separate class names from arguments" do
ClassAndArgumentsParser.parse('Foo').should == ['Foo', nil]
ClassAndArgumentsParser.parse('Foo:arg').should == ['Foo', 'arg']
ClassAndArgumentsParser.parse('Foo::Bar::Zap:arg').should == ['Foo::Bar::Zap', 'arg']
ClassAndArgumentsParser.parse('Foo:arg1,arg2').should == ['Foo', 'arg1,arg2']
ClassAndArgumentsParser.parse('Foo::Bar::Zap:arg1,arg2').should == ['Foo::Bar::Zap', 'arg1,arg2']
ClassAndArgumentsParser.parse('Foo::Bar::Zap:drb://foo,drb://bar').should == ['Foo::Bar::Zap', 'drb://foo,drb://bar']
end
it "should raise an error when passed an empty string" do
lambda do
ClassAndArgumentsParser.parse('')
end.should raise_error("Couldn't parse \"\"")
end
end
end
end

View file

@ -0,0 +1,147 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Runner
describe CommandLine, ".run" do
it_should_behave_like "sandboxed rspec_options"
attr_reader :options, :err, :out
before do
@err = options.error_stream
@out = options.output_stream
end
it "should run directory" do
file = File.dirname(__FILE__) + '/../../../examples/pure'
Spec::Runner::CommandLine.run(OptionParser.parse([file,"-p","**/*.rb"], @err, @out))
@out.rewind
@out.read.should =~ /\d+ examples, 0 failures, 3 pending/n
end
it "should run file" do
file = File.dirname(__FILE__) + '/../../../failing_examples/predicate_example.rb'
Spec::Runner::CommandLine.run(OptionParser.parse([file], @err, @out))
@out.rewind
@out.read.should =~ /2 examples, 1 failure/n
end
it "should raise when file does not exist" do
file = File.dirname(__FILE__) + '/doesntexist'
lambda {
Spec::Runner::CommandLine.run(OptionParser.parse([file], @err, @out))
}.should raise_error
end
it "should return true when in --generate-options mode" do
# NOTE - this used to say /dev/null but jruby hangs on that for some reason
Spec::Runner::CommandLine.run(
OptionParser.parse(['--generate-options', '/tmp/foo'], @err, @out)
).should be_true
end
it "should dump even if Interrupt exception is occurred" do
example_group = Class.new(::Spec::Example::ExampleGroup) do
describe("example_group")
it "no error" do
end
it "should interrupt" do
raise Interrupt, "I'm interrupting"
end
end
options = ::Spec::Runner::Options.new(@err, @out)
::Spec::Runner::Options.should_receive(:new).with(@err, @out).and_return(options)
options.reporter.should_receive(:dump)
options.add_example_group(example_group)
Spec::Runner::CommandLine.run(OptionParser.parse([], @err, @out))
end
it "should heckle when options have heckle_runner" do
example_group = Class.new(::Spec::Example::ExampleGroup).describe("example_group") do
it "no error" do
end
end
options = ::Spec::Runner::Options.new(@err, @out)
::Spec::Runner::Options.should_receive(:new).with(@err, @out).and_return(options)
options.add_example_group example_group
heckle_runner = mock("heckle_runner")
heckle_runner.should_receive(:heckle_with)
$rspec_mocks.__send__(:mocks).delete(heckle_runner)
options.heckle_runner = heckle_runner
options.add_example_group(example_group)
Spec::Runner::CommandLine.run(OptionParser.parse([], @err, @out))
heckle_runner.rspec_verify
end
it "should run examples backwards if options.reverse is true" do
options = ::Spec::Runner::Options.new(@err, @out)
::Spec::Runner::Options.should_receive(:new).with(@err, @out).and_return(options)
options.reverse = true
b1 = Class.new(Spec::Example::ExampleGroup)
b2 = Class.new(Spec::Example::ExampleGroup)
b2.should_receive(:run).ordered
b1.should_receive(:run).ordered
options.add_example_group(b1)
options.add_example_group(b2)
Spec::Runner::CommandLine.run(OptionParser.parse([], @err, @out))
end
it "should pass its ExampleGroup to the reporter" do
example_group = Class.new(::Spec::Example::ExampleGroup).describe("example_group") do
it "should" do
end
end
options = ::Spec::Runner::Options.new(@err, @out)
options.add_example_group(example_group)
::Spec::Runner::Options.should_receive(:new).with(@err, @out).and_return(options)
options.reporter.should_receive(:add_example_group).with(example_group)
Spec::Runner::CommandLine.run(OptionParser.parse([], @err, @out))
end
it "runs only selected Examples when options.examples is set" do
options = ::Spec::Runner::Options.new(@err, @out)
::Spec::Runner::Options.should_receive(:new).with(@err, @out).and_return(options)
options.examples << "example_group should"
should_has_run = false
should_not_has_run = false
example_group = Class.new(::Spec::Example::ExampleGroup).describe("example_group") do
it "should" do
should_has_run = true
end
it "should not" do
should_not_has_run = true
end
end
options.reporter.should_receive(:add_example_group).with(example_group)
options.add_example_group example_group
Spec::Runner::CommandLine.run(OptionParser.parse([], @err, @out))
should_has_run.should be_true
should_not_has_run.should be_false
end
it "sets Spec.run to true" do
::Spec.run = false
::Spec.should_not be_run
Spec::Runner::CommandLine.run(OptionParser.parse([], @err, @out))
::Spec.should be_run
end
end
end
end

View file

@ -0,0 +1,92 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
module Spec
module Runner
describe DrbCommandLine, "without running local server" do
unless Config::CONFIG['ruby_install_name'] == 'jruby'
it "should print error when there is no running local server" do
err = StringIO.new
out = StringIO.new
DrbCommandLine.run(OptionParser.parse(['--version'], err, out))
err.rewind
err.read.should =~ /No server is running/
end
end
end
class DrbCommandLineSpec < ::Spec::Example::ExampleGroup
describe DrbCommandLine, "with local server"
class CommandLineForSpec
def self.run(argv, stderr, stdout)
exit Spec::Runner::CommandLine.run(OptionParser.parse(argv, stderr, stdout))
end
end
unless Config::CONFIG['ruby_install_name'] == 'jruby'
before(:all) do
DRb.start_service("druby://127.0.0.1:8989", CommandLineForSpec)
@@drb_example_file_counter = 0
end
before(:each) do
create_dummy_spec_file
@@drb_example_file_counter = @@drb_example_file_counter + 1
end
after(:each) do
File.delete(@dummy_spec_filename)
end
after(:all) do
DRb.stop_service
end
it "should run against local server" do
out = run_spec_via_druby(['--version'])
out.should =~ /RSpec/n
end
it "should output green colorized text when running with --colour option" do
out = run_spec_via_druby(["--colour", @dummy_spec_filename])
out.should =~ /\e\[32m/n
end
it "should output red colorized text when running with -c option" do
out = run_spec_via_druby(["-c", @dummy_spec_filename])
out.should =~ /\e\[31m/n
end
def create_dummy_spec_file
@dummy_spec_filename = File.expand_path(File.dirname(__FILE__)) + "/_dummy_spec#{@@drb_example_file_counter}.rb"
File.open(@dummy_spec_filename, 'w') do |f|
f.write %{
describe "DUMMY CONTEXT for 'DrbCommandLine with -c option'" do
it "should be output with green bar" do
true.should be_true
end
it "should be output with red bar" do
violated("I want to see a red bar!")
end
end
}
end
end
def run_spec_via_druby(argv)
err, out = StringIO.new, StringIO.new
out.instance_eval do
def tty?; true end
end
options = ::Spec::Runner::Options.new(err, out)
options.argv = argv
Spec::Runner::DrbCommandLine.run(options)
out.rewind; out.read
end
end
end
end
end

View file

View file

@ -0,0 +1,2 @@
Sir, if you were my husband, I would poison your drink.
Madam, if you were my wife, I would drink it.

View file

@ -0,0 +1,37 @@
require File.dirname(__FILE__) + '/../../spec_helper.rb'
describe "ExecutionContext" do
it "should provide duck_type()" do
dt = duck_type(:length)
dt.should be_an_instance_of(Spec::Mocks::DuckTypeArgConstraint)
dt.matches?([]).should be_true
end
it "should provide hash_including" do
hi = hash_including(:a => 1)
hi.should be_an_instance_of(Spec::Mocks::HashIncludingConstraint)
hi.matches?(:a => 1).should be_true
end
it "should violate when violated()" do
lambda do
violated
end.should raise_error(Spec::Expectations::ExpectationNotMetError)
end
it "should provide mock()" do
mock("thing").should be_an_instance_of(Spec::Mocks::Mock)
end
it "should provide stub()" do
thing_stub = stub("thing").should be_an_instance_of(Spec::Mocks::Mock)
end
it "should add method stubs to stub()" do
thing_stub = stub("thing", :a => "A", :b => "B")
thing_stub.a.should == "A"
thing_stub.b.should == "B"
end
end

View file

@ -0,0 +1,3 @@
heckler_spec.rb
command_line_spec.rb
reporter_spec.rb

View file

@ -0,0 +1,45 @@
require File.dirname(__FILE__) + '/../../../spec_helper'
require 'spec/runner/formatter/failing_example_groups_formatter'
module Spec
module Runner
module Formatter
describe FailingExampleGroupsFormatter do
attr_reader :example_group, :formatter, :io
before(:each) do
@io = StringIO.new
options = mock('options')
@formatter = FailingExampleGroupsFormatter.new(options, io)
@example_group = Class.new(::Spec::Example::ExampleGroup)
end
it "should add example name for each failure" do
formatter.add_example_group(Class.new(ExampleGroup).describe("b 1"))
formatter.example_failed("e 1", nil, Reporter::Failure.new(nil, RuntimeError.new))
formatter.add_example_group(Class.new(ExampleGroup).describe("b 2"))
formatter.example_failed("e 2", nil, Reporter::Failure.new(nil, RuntimeError.new))
formatter.example_failed("e 3", nil, Reporter::Failure.new(nil, RuntimeError.new))
io.string.should include("b 1")
io.string.should include("b 2")
end
it "should delimit ExampleGroup superclass descriptions with :" do
parent_example_group = Class.new(example_group).describe("Parent")
child_example_group = Class.new(parent_example_group).describe("#child_method")
grand_child_example_group = Class.new(child_example_group).describe("GrandChild")
formatter.add_example_group(grand_child_example_group)
formatter.example_failed("failure", nil, Reporter::Failure.new(nil, RuntimeError.new))
io.string.should == "Parent#child_method GrandChild\n"
end
it "should remove druby url, which is used by Spec::Distributed" do
@formatter.add_example_group(Class.new(ExampleGroup).describe("something something (druby://99.99.99.99:99)"))
@formatter.example_failed("e 1", nil, Reporter::Failure.new(nil, RuntimeError.new))
io.string.should == "something something\n"
end
end
end
end
end

View file

@ -0,0 +1,33 @@
require File.dirname(__FILE__) + '/../../../spec_helper'
require 'spec/runner/formatter/failing_examples_formatter'
module Spec
module Runner
module Formatter
describe FailingExamplesFormatter do
before(:each) do
@io = StringIO.new
options = mock('options')
@formatter = FailingExamplesFormatter.new(options, @io)
end
it "should add example name for each failure" do
example_group_1 = Class.new(ExampleGroup).describe("A")
example_group_2 = Class.new(example_group_1).describe("B")
@formatter.add_example_group(example_group_1)
@formatter.example_failed(example_group_1.it("a1"){}, nil, Reporter::Failure.new(nil, RuntimeError.new))
@formatter.add_example_group(example_group_2)
@formatter.example_failed(example_group_2.it("b2"){}, nil, Reporter::Failure.new(nil, RuntimeError.new))
@formatter.example_failed(example_group_2.it("b3"){}, nil, Reporter::Failure.new(nil, RuntimeError.new))
@io.string.should eql(<<-EOF
A a1
A B b2
A B b3
EOF
)
end
end
end
end
end

View file

@ -0,0 +1,365 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>RSpec results</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Expires" content="-1" />
<meta http-equiv="Pragma" content="no-cache" />
<style type="text/css">
body {
margin: 0;
padding: 0;
background: #fff;
font-size: 80%;
}
</style>
</head>
<body>
<div class="rspec-report">
<script type="text/javascript">
// <![CDATA[
function moveProgressBar(percentDone) {
document.getElementById("rspec-header").style.width = percentDone +"%";
}
function makeRed(element_id) {
document.getElementById(element_id).style.background = '#C40D0D';
document.getElementById(element_id).style.color = '#FFFFFF';
}
function makeYellow(element_id) {
if (element_id == "rspec-header" && document.getElementById(element_id).style.background != '#C40D0D')
{
document.getElementById(element_id).style.background = '#FAF834';
document.getElementById(element_id).style.color = '#000000';
}
else
{
document.getElementById(element_id).style.background = '#FAF834';
document.getElementById(element_id).style.color = '#000000';
}
}
// ]]>
</script>
<style type="text/css">
#rspec-header {
background: #65C400; color: #fff;
}
.rspec-report h1 {
margin: 0px 10px 0px 10px;
padding: 10px;
font-family: "Lucida Grande", Helvetica, sans-serif;
font-size: 1.8em;
}
#summary {
margin: 0; padding: 5px 10px;
font-family: "Lucida Grande", Helvetica, sans-serif;
text-align: right;
position: absolute;
top: 0px;
right: 0px;
}
#summary p {
margin: 0 0 0 2px;
}
#summary #totals {
font-size: 1.2em;
}
.example_group {
margin: 0 10px 5px;
background: #fff;
}
dl {
margin: 0; padding: 0 0 5px;
font: normal 11px "Lucida Grande", Helvetica, sans-serif;
}
dt {
padding: 3px;
background: #65C400;
color: #fff;
font-weight: bold;
}
dd {
margin: 5px 0 5px 5px;
padding: 3px 3px 3px 18px;
}
dd.spec.passed {
border-left: 5px solid #65C400;
border-bottom: 1px solid #65C400;
background: #DBFFB4; color: #3D7700;
}
dd.spec.failed {
border-left: 5px solid #C20000;
border-bottom: 1px solid #C20000;
color: #C20000; background: #FFFBD3;
}
dd.spec.not_implemented {
border-left: 5px solid #FAF834;
border-bottom: 1px solid #FAF834;
background: #FCFB98; color: #131313;
}
dd.spec.pending_fixed {
border-left: 5px solid #0000C2;
border-bottom: 1px solid #0000C2;
color: #0000C2; background: #D3FBFF;
}
.backtrace {
color: #000;
font-size: 12px;
}
a {
color: #BE5C00;
}
/* Ruby code, style similar to vibrant ink */
.ruby {
font-size: 12px;
font-family: monospace;
color: white;
background-color: black;
padding: 0.1em 0 0.2em 0;
}
.ruby .keyword { color: #FF6600; }
.ruby .constant { color: #339999; }
.ruby .attribute { color: white; }
.ruby .global { color: white; }
.ruby .module { color: white; }
.ruby .class { color: white; }
.ruby .string { color: #66FF00; }
.ruby .ident { color: white; }
.ruby .method { color: #FFCC00; }
.ruby .number { color: white; }
.ruby .char { color: white; }
.ruby .comment { color: #9933CC; }
.ruby .symbol { color: white; }
.ruby .regex { color: #44B4CC; }
.ruby .punct { color: white; }
.ruby .escape { color: white; }
.ruby .interp { color: white; }
.ruby .expr { color: white; }
.ruby .offending { background-color: gray; }
.ruby .linenum {
width: 75px;
padding: 0.1em 1em 0.2em 0;
color: #000000;
background-color: #FFFBD3;
}
</style>
<div id="rspec-header">
<h1>RSpec Results</h1>
<div id="summary">
<p id="totals">&nbsp;</p>
<p id="duration">&nbsp;</p>
</div>
</div>
<div class="results">
<div class="example_group">
<dl>
<dt id="example_group_1">Mocker</dt>
<script type="text/javascript">moveProgressBar('5.8');</script>
<dd class="spec passed"><span class="passed_spec_name">should be able to call mock()</span></dd>
<script type="text/javascript">makeRed('rspec-header');</script>
<script type="text/javascript">makeRed('example_group_1');</script>
<script type="text/javascript">moveProgressBar('11.7');</script>
<dd class="spec failed">
<span class="failed_spec_name">should fail when expected message not received</span>
<div class="failure" id="failure_1">
<div class="message"><pre>Mock 'poke me' expected :poke with (any args) once, but received it 0 times</pre></div>
<div class="backtrace"><pre>./failing_examples/mocking_example.rb:13:
./spec/spec/runner/formatter/html_formatter_spec.rb:24:
./spec/spec/runner/formatter/html_formatter_spec.rb:20:</pre></div>
<pre class="ruby"><code><span class="linenum">11</span> <span class="ident">it</span> <span class="punct">&quot;</span><span class="string">should fail when expected message not received</span><span class="punct">&quot;</span> <span class="keyword">do</span>
<span class="linenum">12</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">(&quot;</span><span class="string">poke me</span><span class="punct">&quot;)</span>
<span class="offending"><span class="linenum">13</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_receive</span><span class="punct">(</span><span class="symbol">:poke</span><span class="punct">)</span></span>
<span class="linenum">14</span> <span class="keyword">end</span>
<span class="linenum">15</span> </code></pre>
</div>
</dd>
<script type="text/javascript">moveProgressBar('17.6');</script>
<dd class="spec failed">
<span class="failed_spec_name">should fail when messages are received out of order</span>
<div class="failure" id="failure_2">
<div class="message"><pre>Mock 'one two three' received :three out of order</pre></div>
<div class="backtrace"><pre>./failing_examples/mocking_example.rb:22:
./spec/spec/runner/formatter/html_formatter_spec.rb:24:
./spec/spec/runner/formatter/html_formatter_spec.rb:20:</pre></div>
<pre class="ruby"><code><span class="linenum">20</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_receive</span><span class="punct">(</span><span class="symbol">:three</span><span class="punct">).</span><span class="ident">ordered</span>
<span class="linenum">21</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">one</span>
<span class="offending"><span class="linenum">22</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">three</span></span>
<span class="linenum">23</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">two</span>
<span class="linenum">24</span> <span class="keyword">end</span></code></pre>
</div>
</dd>
<script type="text/javascript">moveProgressBar('23.5');</script>
<dd class="spec failed">
<span class="failed_spec_name">should get yelled at when sending unexpected messages</span>
<div class="failure" id="failure_3">
<div class="message"><pre>Mock 'don't talk to me' expected :any_message_at_all with (any args) 0 times, but received it once</pre></div>
<div class="backtrace"><pre>./failing_examples/mocking_example.rb:28:
./spec/spec/runner/formatter/html_formatter_spec.rb:24:
./spec/spec/runner/formatter/html_formatter_spec.rb:20:</pre></div>
<pre class="ruby"><code><span class="linenum">26</span> <span class="ident">it</span> <span class="punct">&quot;</span><span class="string">should get yelled at when sending unexpected messages</span><span class="punct">&quot;</span> <span class="keyword">do</span>
<span class="linenum">27</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">(&quot;</span><span class="string">don't talk to me</span><span class="punct">&quot;)</span>
<span class="offending"><span class="linenum">28</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_not_receive</span><span class="punct">(</span><span class="symbol">:any_message_at_all</span><span class="punct">)</span></span>
<span class="linenum">29</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">any_message_at_all</span>
<span class="linenum">30</span> <span class="keyword">end</span></code></pre>
</div>
</dd>
<script type="text/javascript">moveProgressBar('29.4');</script>
<dd class="spec pending_fixed">
<span class="failed_spec_name">has a bug we need to fix</span>
<div class="failure" id="failure_4">
<div class="message"><pre>Expected pending 'here is the bug' to fail. No Error was raised.</pre></div>
<div class="backtrace"><pre>./failing_examples/mocking_example.rb:33:
./spec/spec/runner/formatter/html_formatter_spec.rb:24:
./spec/spec/runner/formatter/html_formatter_spec.rb:20:</pre></div>
<pre class="ruby"><code><span class="linenum">31</span>
<span class="linenum">32</span> <span class="ident">it</span> <span class="punct">&quot;</span><span class="string">has a bug we need to fix</span><span class="punct">&quot;</span> <span class="keyword">do</span>
<span class="offending"><span class="linenum">33</span> <span class="ident">pending</span> <span class="punct">&quot;</span><span class="string">here is the bug</span><span class="punct">&quot;</span> <span class="keyword">do</span></span>
<span class="linenum">34</span> <span class="comment"># Actually, no. It's fixed. This will fail because it passes :-)</span>
<span class="linenum">35</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">(&quot;</span><span class="string">Bug</span><span class="punct">&quot;)</span></code></pre>
</div>
</dd>
</dl>
</div>
<div class="example_group">
<dl>
<dt id="example_group_2">Running specs with --diff</dt>
<script type="text/javascript">makeRed('example_group_2');</script>
<script type="text/javascript">moveProgressBar('35.2');</script>
<dd class="spec failed">
<span class="failed_spec_name">should print diff of different strings</span>
<div class="failure" id="failure_5">
<div class="message"><pre>expected: &quot;RSpec is a\nbehaviour driven development\nframework for Ruby\n&quot;,
got: &quot;RSpec is a\nbehavior driven development\nframework for Ruby\n&quot; (using ==)
Diff:
@@ -1,4 +1,4 @@
RSpec is a
-behavior driven development
+behaviour driven development
framework for Ruby
</pre></div>
<div class="backtrace"><pre>./failing_examples/diffing_spec.rb:13:
./spec/spec/runner/formatter/html_formatter_spec.rb:24:
./spec/spec/runner/formatter/html_formatter_spec.rb:20:</pre></div>
<pre class="ruby"><code><span class="linenum">11</span><span class="ident">framework</span> <span class="keyword">for</span> <span class="constant">Ruby</span>
<span class="linenum">12</span><span class="constant">EOF</span>
<span class="offending"><span class="linenum">13</span> <span class="ident">usa</span><span class="punct">.</span><span class="ident">should</span> <span class="punct">==</span> <span class="ident">uk</span></span>
<span class="linenum">14</span> <span class="keyword">end</span></code></pre>
</div>
</dd>
<script type="text/javascript">moveProgressBar('41.1');</script>
<dd class="spec failed">
<span class="failed_spec_name">should print diff of different objects' pretty representation</span>
<div class="failure" id="failure_6">
<div class="message"><pre>expected &lt;Animal
name=bob,
species=tortoise
&gt;
, got &lt;Animal
name=bob,
species=giraffe
&gt;
(using .eql?)
Diff:
@@ -1,5 +1,5 @@
&lt;Animal
name=bob,
-species=giraffe
+species=tortoise
&gt;
</pre></div>
<div class="backtrace"><pre>./failing_examples/diffing_spec.rb:34:
./spec/spec/runner/formatter/html_formatter_spec.rb:24:
./spec/spec/runner/formatter/html_formatter_spec.rb:20:</pre></div>
<pre class="ruby"><code><span class="linenum">32</span> <span class="ident">expected</span> <span class="punct">=</span> <span class="constant">Animal</span><span class="punct">.</span><span class="ident">new</span> <span class="punct">&quot;</span><span class="string">bob</span><span class="punct">&quot;,</span> <span class="punct">&quot;</span><span class="string">giraffe</span><span class="punct">&quot;</span>
<span class="linenum">33</span> <span class="ident">actual</span> <span class="punct">=</span> <span class="constant">Animal</span><span class="punct">.</span><span class="ident">new</span> <span class="punct">&quot;</span><span class="string">bob</span><span class="punct">&quot;,</span> <span class="punct">&quot;</span><span class="string">tortoise</span><span class="punct">&quot;</span>
<span class="offending"><span class="linenum">34</span> <span class="ident">expected</span><span class="punct">.</span><span class="ident">should</span> <span class="ident">eql</span><span class="punct">(</span><span class="ident">actual</span><span class="punct">)</span></span>
<span class="linenum">35</span> <span class="keyword">end</span>
<span class="linenum">36</span><span class="keyword">end</span></code></pre>
</div>
</dd>
</dl>
</div>
<div class="example_group">
<dl>
<dt id="example_group_3">A consumer of a stub</dt>
<script type="text/javascript">moveProgressBar('47.0');</script>
<dd class="spec passed"><span class="passed_spec_name">should be able to stub methods on any Object</span></dd>
</dl>
</div>
<div class="example_group">
<dl>
<dt id="example_group_4">A stubbed method on a class</dt>
<script type="text/javascript">moveProgressBar('52.9');</script>
<dd class="spec passed"><span class="passed_spec_name">should return the stubbed value</span></dd>
<script type="text/javascript">moveProgressBar('58.8');</script>
<dd class="spec passed"><span class="passed_spec_name">should revert to the original method after each spec</span></dd>
<script type="text/javascript">moveProgressBar('64.7');</script>
<dd class="spec passed"><span class="passed_spec_name">can stub! and mock the same message</span></dd>
</dl>
</div>
<div class="example_group">
<dl>
<dt id="example_group_5">A mock</dt>
<script type="text/javascript">moveProgressBar('70.5');</script>
<dd class="spec passed"><span class="passed_spec_name">can stub!</span></dd>
<script type="text/javascript">moveProgressBar('76.4');</script>
<dd class="spec passed"><span class="passed_spec_name">can stub! and mock</span></dd>
<script type="text/javascript">moveProgressBar('82.3');</script>
<dd class="spec passed"><span class="passed_spec_name">can stub! and mock the same message</span></dd>
</dl>
</div>
<div class="example_group">
<dl>
<dt id="example_group_6">pending example (using pending method)</dt>
<script type="text/javascript">makeYellow('example_group_6');</script>
<script type="text/javascript">moveProgressBar('88.2');</script>
<dd class="spec not_implemented"><span class="not_implemented_spec_name">should be reported as &quot;PENDING: for some reason&quot; (PENDING: for some reason)</span></dd>
</dl>
</div>
<div class="example_group">
<dl>
<dt id="example_group_7">pending example (with no block)</dt>
<script type="text/javascript">makeYellow('example_group_7');</script>
<script type="text/javascript">moveProgressBar('94.1');</script>
<dd class="spec not_implemented"><span class="not_implemented_spec_name">should be reported as &quot;PENDING: Not Yet Implemented&quot; (PENDING: Not Yet Implemented)</span></dd>
</dl>
</div>
<div class="example_group">
<dl>
<dt id="example_group_8">pending example (with block for pending)</dt>
<script type="text/javascript">makeYellow('example_group_8');</script>
<script type="text/javascript">moveProgressBar('100.0');</script>
<dd class="spec not_implemented"><span class="not_implemented_spec_name">should have a failing block, passed to pending, reported as &quot;PENDING: for some reason&quot; (PENDING: for some reason)</span></dd>
</dl>
</div>
<script type="text/javascript">document.getElementById('duration').innerHTML = "Finished in <strong>x seconds</strong>";</script>
<script type="text/javascript">document.getElementById('totals').innerHTML = "17 examples, 6 failures, 3 pending";</script>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,387 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>RSpec results</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Expires" content="-1" />
<meta http-equiv="Pragma" content="no-cache" />
<style type="text/css">
body {
margin: 0;
padding: 0;
background: #fff;
font-size: 80%;
}
</style>
</head>
<body>
<div class="rspec-report">
<script type="text/javascript">
// <![CDATA[
function moveProgressBar(percentDone) {
document.getElementById("rspec-header").style.width = percentDone +"%";
}
function makeRed(element_id) {
document.getElementById(element_id).style.background = '#C40D0D';
document.getElementById(element_id).style.color = '#FFFFFF';
}
function makeYellow(element_id) {
if (element_id == "rspec-header" && document.getElementById(element_id).style.background != '#C40D0D')
{
document.getElementById(element_id).style.background = '#FAF834';
document.getElementById(element_id).style.color = '#000000';
}
else
{
document.getElementById(element_id).style.background = '#FAF834';
document.getElementById(element_id).style.color = '#000000';
}
}
// ]]>
</script>
<style type="text/css">
#rspec-header {
background: #65C400; color: #fff;
}
.rspec-report h1 {
margin: 0px 10px 0px 10px;
padding: 10px;
font-family: "Lucida Grande", Helvetica, sans-serif;
font-size: 1.8em;
}
#summary {
margin: 0; padding: 5px 10px;
font-family: "Lucida Grande", Helvetica, sans-serif;
text-align: right;
position: absolute;
top: 0px;
right: 0px;
}
#summary p {
margin: 0 0 0 2px;
}
#summary #totals {
font-size: 1.2em;
}
.example_group {
margin: 0 10px 5px;
background: #fff;
}
dl {
margin: 0; padding: 0 0 5px;
font: normal 11px "Lucida Grande", Helvetica, sans-serif;
}
dt {
padding: 3px;
background: #65C400;
color: #fff;
font-weight: bold;
}
dd {
margin: 5px 0 5px 5px;
padding: 3px 3px 3px 18px;
}
dd.spec.passed {
border-left: 5px solid #65C400;
border-bottom: 1px solid #65C400;
background: #DBFFB4; color: #3D7700;
}
dd.spec.failed {
border-left: 5px solid #C20000;
border-bottom: 1px solid #C20000;
color: #C20000; background: #FFFBD3;
}
dd.spec.not_implemented {
border-left: 5px solid #FAF834;
border-bottom: 1px solid #FAF834;
background: #FCFB98; color: #131313;
}
dd.spec.pending_fixed {
border-left: 5px solid #0000C2;
border-bottom: 1px solid #0000C2;
color: #0000C2; background: #D3FBFF;
}
.backtrace {
color: #000;
font-size: 12px;
}
a {
color: #BE5C00;
}
/* Ruby code, style similar to vibrant ink */
.ruby {
font-size: 12px;
font-family: monospace;
color: white;
background-color: black;
padding: 0.1em 0 0.2em 0;
}
.ruby .keyword { color: #FF6600; }
.ruby .constant { color: #339999; }
.ruby .attribute { color: white; }
.ruby .global { color: white; }
.ruby .module { color: white; }
.ruby .class { color: white; }
.ruby .string { color: #66FF00; }
.ruby .ident { color: white; }
.ruby .method { color: #FFCC00; }
.ruby .number { color: white; }
.ruby .char { color: white; }
.ruby .comment { color: #9933CC; }
.ruby .symbol { color: white; }
.ruby .regex { color: #44B4CC; }
.ruby .punct { color: white; }
.ruby .escape { color: white; }
.ruby .interp { color: white; }
.ruby .expr { color: white; }
.ruby .offending { background-color: gray; }
.ruby .linenum {
width: 75px;
padding: 0.1em 1em 0.2em 0;
color: #000000;
background-color: #FFFBD3;
}
</style>
<div id="rspec-header">
<h1>RSpec Results</h1>
<div id="summary">
<p id="totals">&nbsp;</p>
<p id="duration">&nbsp;</p>
</div>
</div>
<div class="results">
<div class="example_group">
<dl>
<dt id="example_group_1">Mocker</dt>
<script type="text/javascript">moveProgressBar('5.8');</script>
<dd class="spec passed"><span class="passed_spec_name">should be able to call mock()</span></dd>
<script type="text/javascript">makeRed('rspec-header');</script>
<script type="text/javascript">makeRed('example_group_1');</script>
<script type="text/javascript">moveProgressBar('11.7');</script>
<dd class="spec failed">
<span class="failed_spec_name">should fail when expected message not received</span>
<div class="failure" id="failure_1">
<div class="message"><pre>Mock 'poke me' expected :poke with (any args) once, but received it 0 times</pre></div>
<div class="backtrace"><pre>/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/mocking_example.rb:13:in `should_receive'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:24:in `run'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `instance_eval'</pre></div>
<pre class="ruby"><code><span class="linenum">11</span> it "should fail when expected message not received" do
<span class="linenum">12</span> mock = mock("poke me")
<span class="offending"><span class="linenum">13</span> mock.should_receive(:poke)</span>
<span class="linenum">14</span> end
<span class="linenum">15</span>
<span class="linenum">16</span><span class="comment"># gem install syntax to get syntax highlighting</span></code></pre>
</div>
</dd>
<script type="text/javascript">moveProgressBar('17.6');</script>
<dd class="spec failed">
<span class="failed_spec_name">should fail when messages are received out of order</span>
<div class="failure" id="failure_2">
<div class="message"><pre>Mock 'one two three' received :three out of order</pre></div>
<div class="backtrace"><pre>/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/mocking_example.rb:22:in `three'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/mocking_example.rb:16:in `instance_eval'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:24:in `run'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `instance_eval'</pre></div>
<pre class="ruby"><code><span class="linenum">20</span> mock.should_receive(:three).ordered
<span class="linenum">21</span> mock.one
<span class="offending"><span class="linenum">22</span> mock.three</span>
<span class="linenum">23</span> mock.two
<span class="linenum">24</span> end
<span class="linenum">25</span><span class="comment"># gem install syntax to get syntax highlighting</span></code></pre>
</div>
</dd>
<script type="text/javascript">moveProgressBar('23.5');</script>
<dd class="spec failed">
<span class="failed_spec_name">should get yelled at when sending unexpected messages</span>
<div class="failure" id="failure_3">
<div class="message"><pre>Mock 'don't talk to me' expected :any_message_at_all with (any args) 0 times, but received it once</pre></div>
<div class="backtrace"><pre>/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/mocking_example.rb:28:in `should_not_receive'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:24:in `run'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `instance_eval'</pre></div>
<pre class="ruby"><code><span class="linenum">26</span> it "should get yelled at when sending unexpected messages" do
<span class="linenum">27</span> mock = mock("don't talk to me")
<span class="offending"><span class="linenum">28</span> mock.should_not_receive(:any_message_at_all)</span>
<span class="linenum">29</span> mock.any_message_at_all
<span class="linenum">30</span> end
<span class="linenum">31</span><span class="comment"># gem install syntax to get syntax highlighting</span></code></pre>
</div>
</dd>
<script type="text/javascript">moveProgressBar('29.4');</script>
<dd class="spec pending_fixed">
<span class="failed_spec_name">has a bug we need to fix</span>
<div class="failure" id="failure_4">
<div class="message"><pre>Expected pending 'here is the bug' to fail. No Error was raised.</pre></div>
<div class="backtrace"><pre>/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/mocking_example.rb:33:in `pending'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/mocking_example.rb:33:in `instance_eval'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:24:in `run'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `instance_eval'</pre></div>
<pre class="ruby"><code><span class="linenum">31</span>
<span class="linenum">32</span> it "has a bug we need to fix" do
<span class="offending"><span class="linenum">33</span> pending "here is the bug" do</span>
<span class="linenum">34</span> # Actually, no. It's fixed. This will fail because it passes :-)
<span class="linenum">35</span> mock = mock("Bug")
<span class="linenum">36</span><span class="comment"># gem install syntax to get syntax highlighting</span></code></pre>
</div>
</dd>
</dl>
</div>
<div class="example_group">
<dl>
<dt id="example_group_2">Running specs with --diff</dt>
<script type="text/javascript">makeRed('example_group_2');</script>
<script type="text/javascript">moveProgressBar('35.2');</script>
<dd class="spec failed">
<span class="failed_spec_name">should print diff of different strings</span>
<div class="failure" id="failure_5">
<div class="message"><pre>expected: &quot;RSpec is a\nbehaviour driven development\nframework for Ruby\n&quot;,
got: &quot;RSpec is a\nbehavior driven development\nframework for Ruby\n&quot; (using ==)
Diff:
@@ -1,4 +1,4 @@
RSpec is a
-behavior driven development
+behaviour driven development
framework for Ruby
</pre></div>
<div class="backtrace"><pre>/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/diffing_spec.rb:13:in `=='
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:24:in `run'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `instance_eval'</pre></div>
<pre class="ruby"><code><span class="linenum">11</span>framework for Ruby
<span class="linenum">12</span>EOF
<span class="offending"><span class="linenum">13</span> usa.should == uk</span>
<span class="linenum">14</span> end
<span class="linenum">15</span>
<span class="linenum">16</span><span class="comment"># gem install syntax to get syntax highlighting</span></code></pre>
</div>
</dd>
<script type="text/javascript">moveProgressBar('41.1');</script>
<dd class="spec failed">
<span class="failed_spec_name">should print diff of different objects' pretty representation</span>
<div class="failure" id="failure_6">
<div class="message"><pre>expected &lt;Animal
name=bob,
species=tortoise
&gt;
, got &lt;Animal
name=bob,
species=giraffe
&gt;
(using .eql?)
Diff:
@@ -1,5 +1,5 @@
&lt;Animal
name=bob,
-species=giraffe
+species=tortoise
&gt;
</pre></div>
<div class="backtrace"><pre>/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/diffing_spec.rb:34:in `should'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/diffing_spec.rb:31:in `instance_eval'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:24:in `run'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir'
/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `instance_eval'</pre></div>
<pre class="ruby"><code><span class="linenum">32</span> expected = Animal.new "bob", "giraffe"
<span class="linenum">33</span> actual = Animal.new "bob", "tortoise"
<span class="offending"><span class="linenum">34</span> expected.should eql(actual)</span>
<span class="linenum">35</span> end
<span class="linenum">36</span>end
<span class="linenum">37</span><span class="comment"># gem install syntax to get syntax highlighting</span></code></pre>
</div>
</dd>
</dl>
</div>
<div class="example_group">
<dl>
<dt id="example_group_3">A consumer of a stub</dt>
<script type="text/javascript">moveProgressBar('47.0');</script>
<dd class="spec passed"><span class="passed_spec_name">should be able to stub methods on any Object</span></dd>
</dl>
</div>
<div class="example_group">
<dl>
<dt id="example_group_4">A stubbed method on a class</dt>
<script type="text/javascript">moveProgressBar('52.9');</script>
<dd class="spec passed"><span class="passed_spec_name">should return the stubbed value</span></dd>
<script type="text/javascript">moveProgressBar('58.8');</script>
<dd class="spec passed"><span class="passed_spec_name">should revert to the original method after each spec</span></dd>
<script type="text/javascript">moveProgressBar('64.7');</script>
<dd class="spec passed"><span class="passed_spec_name">can stub! and mock the same message</span></dd>
</dl>
</div>
<div class="example_group">
<dl>
<dt id="example_group_5">A mock</dt>
<script type="text/javascript">moveProgressBar('70.5');</script>
<dd class="spec passed"><span class="passed_spec_name">can stub!</span></dd>
<script type="text/javascript">moveProgressBar('76.4');</script>
<dd class="spec passed"><span class="passed_spec_name">can stub! and mock</span></dd>
<script type="text/javascript">moveProgressBar('82.3');</script>
<dd class="spec passed"><span class="passed_spec_name">can stub! and mock the same message</span></dd>
</dl>
</div>
<div class="example_group">
<dl>
<dt id="example_group_6">pending example (using pending method)</dt>
<script type="text/javascript">makeYellow('example_group_6');</script>
<script type="text/javascript">moveProgressBar('88.2');</script>
<dd class="spec not_implemented"><span class="not_implemented_spec_name">should be reported as &quot;PENDING: for some reason&quot; (PENDING: for some reason)</span></dd>
</dl>
</div>
<div class="example_group">
<dl>
<dt id="example_group_7">pending example (with no block)</dt>
<script type="text/javascript">makeYellow('example_group_7');</script>
<script type="text/javascript">moveProgressBar('94.1');</script>
<dd class="spec not_implemented"><span class="not_implemented_spec_name">should be reported as &quot;PENDING: Not Yet Implemented&quot; (PENDING: Not Yet Implemented)</span></dd>
</dl>
</div>
<div class="example_group">
<dl>
<dt id="example_group_8">pending example (with block for pending)</dt>
<script type="text/javascript">makeYellow('example_group_8');</script>
<script type="text/javascript">moveProgressBar('100.0');</script>
<dd class="spec not_implemented"><span class="not_implemented_spec_name">should have a failing block, passed to pending, reported as &quot;PENDING: for some reason&quot; (PENDING: for some reason)</span></dd>
</dl>
</div>
<script type="text/javascript">document.getElementById('duration').innerHTML = "Finished in <strong>x seconds</strong>";</script>
<script type="text/javascript">document.getElementById('totals').innerHTML = "17 examples, 6 failures, 3 pending";</script>
</div>
</div>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show more