File: //usr/local/rvm/src/ruby-3.0.2/spec/mspec/spec/mocks/proxy_spec.rb
require 'spec_helper'
require 'mspec/mocks/proxy'
describe MockObject, ".new" do
it "creates a new mock object" do
m = MockObject.new('not a null object')
lambda { m.not_a_method }.should raise_error(NoMethodError)
end
it "creates a new mock object that follows the NullObject pattern" do
m = MockObject.new('null object', :null_object => true)
m.not_really_a_method.should equal(m)
end
end
describe MockProxy, ".new" do
it "creates a mock proxy by default" do
MockProxy.new.mock?.should be_true
end
it "creates a stub proxy by request" do
MockProxy.new(:stub).stub?.should be_true
end
it "sets the call expectation to 1 call for a mock" do
MockProxy.new.count.should == [:exactly, 1]
end
it "sets the call expectation to any number of times for a stub" do
MockProxy.new(:stub).count.should == [:any_number_of_times, 0]
end
end
describe MockProxy, "#count" do
before :each do
@proxy = MockProxy.new
end
it "returns the expected number of calls the mock should receive" do
@proxy.count.should == [:exactly, 1]
@proxy.at_least(3).count.should == [:at_least, 3]
end
end
describe MockProxy, "#arguments" do
before :each do
@proxy = MockProxy.new
end
it "returns the expected arguments" do
@proxy.arguments.should == :any_args
end
end
describe MockProxy, "#with" do
before :each do
@proxy = MockProxy.new
end
it "returns self" do
@proxy.with(:a).should be_equal(@proxy)
end
it "raises an ArgumentError if no arguments are given" do
lambda { @proxy.with }.should raise_error(ArgumentError)
end
it "accepts any number of arguments" do
@proxy.with(1, 2, 3).should be_an_instance_of(MockProxy)
@proxy.arguments.should == [1,2,3]
end
end
describe MockProxy, "#once" do
before :each do
@proxy = MockProxy.new
end
it "returns self" do
@proxy.once.should be_equal(@proxy)
end
it "sets the expected calls to 1" do
@proxy.once
@proxy.count.should == [:exactly, 1]
end
it "accepts no arguments" do
lambda { @proxy.once(:a) }.should raise_error
end
end
describe MockProxy, "#twice" do
before :each do
@proxy = MockProxy.new
end
it "returns self" do
@proxy.twice.should be_equal(@proxy)
end
it "sets the expected calls to 2" do
@proxy.twice
@proxy.count.should == [:exactly, 2]
end
it "accepts no arguments" do
lambda { @proxy.twice(:b) }.should raise_error
end
end
describe MockProxy, "#exactly" do
before :each do
@proxy = MockProxy.new
end
it "returns self" do
@proxy.exactly(2).should be_equal(@proxy)
end
it "sets the expected calls to exactly n" do
@proxy.exactly(5)
@proxy.count.should == [:exactly, 5]
end
it "does not accept an argument that Integer() cannot convert" do
lambda { @proxy.exactly('x') }.should raise_error
end
end
describe MockProxy, "#at_least" do
before :each do
@proxy = MockProxy.new
end
it "returns self" do
@proxy.at_least(3).should be_equal(@proxy)
end
it "sets the expected calls to at least n" do
@proxy.at_least(3)
@proxy.count.should == [:at_least, 3]
end
it "accepts :once :twice" do
@proxy.at_least(:once)
@proxy.count.should == [:at_least, 1]
@proxy.at_least(:twice)
@proxy.count.should == [:at_least, 2]
end
it "does not accept an argument that Integer() cannot convert" do
lambda { @proxy.at_least('x') }.should raise_error
end
end
describe MockProxy, "#at_most" do
before :each do
@proxy = MockProxy.new
end
it "returns self" do
@proxy.at_most(2).should be_equal(@proxy)
end
it "sets the expected calls to at most n" do
@proxy.at_most(2)
@proxy.count.should == [:at_most, 2]
end
it "accepts :once, :twice" do
@proxy.at_most(:once)
@proxy.count.should == [:at_most, 1]
@proxy.at_most(:twice)
@proxy.count.should == [:at_most, 2]
end
it "does not accept an argument that Integer() cannot convert" do
lambda { @proxy.at_most('x') }.should raise_error
end
end
describe MockProxy, "#any_number_of_times" do
before :each do
@proxy = MockProxy.new
end
it "returns self" do
@proxy.any_number_of_times.should be_equal(@proxy)
end
it "sets the expected calls to any number of times" do
@proxy.any_number_of_times
@proxy.count.should == [:any_number_of_times, 0]
end
it "does not accept an argument" do
lambda { @proxy.any_number_of_times(2) }.should raise_error
end
end
describe MockProxy, "#and_return" do
before :each do
@proxy = MockProxy.new
end
it "returns self" do
@proxy.and_return(false).should equal(@proxy)
end
it "sets the expected return value" do
@proxy.and_return(false)
@proxy.returning.should == false
end
it "accepts any number of return values" do
@proxy.and_return(1, 2, 3)
@proxy.returning.should == 1
@proxy.returning.should == 2
@proxy.returning.should == 3
end
it "implicitly sets the expected number of calls" do
@proxy.and_return(1, 2, 3)
@proxy.count.should == [:exactly, 3]
end
it "only sets the expected number of calls if it is higher than what is already set" do
@proxy.at_least(5).times.and_return(1, 2, 3)
@proxy.count.should == [:at_least, 5]
@proxy.at_least(2).times.and_return(1, 2, 3)
@proxy.count.should == [:at_least, 3]
end
end
describe MockProxy, "#returning" do
before :each do
@proxy = MockProxy.new
end
it "returns nil by default" do
@proxy.returning.should be_nil
end
it "returns the value set by #and_return" do
@proxy.and_return(2)
@proxy.returning.should == 2
@proxy.returning.should == 2
end
it "returns a sequence of values set by #and_return" do
@proxy.and_return(1,2,3,4)
@proxy.returning.should == 1
@proxy.returning.should == 2
@proxy.returning.should == 3
@proxy.returning.should == 4
@proxy.returning.should == 4
@proxy.returning.should == 4
end
end
describe MockProxy, "#calls" do
before :each do
@proxy = MockProxy.new
end
it "returns the number of times the proxy is called" do
@proxy.calls.should == 0
end
end
describe MockProxy, "#called" do
before :each do
@proxy = MockProxy.new
end
it "increments the number of times the proxy is called" do
@proxy.called
@proxy.called
@proxy.calls.should == 2
end
end
describe MockProxy, "#times" do
before :each do
@proxy = MockProxy.new
end
it "is a no-op" do
@proxy.times.should == @proxy
end
end
describe MockProxy, "#stub?" do
it "returns true if the proxy is created as a stub" do
MockProxy.new(:stub).stub?.should be_true
end
it "returns false if the proxy is created as a mock" do
MockProxy.new(:mock).stub?.should be_false
end
end
describe MockProxy, "#mock?" do
it "returns true if the proxy is created as a mock" do
MockProxy.new(:mock).mock?.should be_true
end
it "returns false if the proxy is created as a stub" do
MockProxy.new(:stub).mock?.should be_false
end
end
describe MockProxy, "#and_yield" do
before :each do
@proxy = MockProxy.new
end
it "returns self" do
@proxy.and_yield(false).should equal(@proxy)
end
it "sets the expected values to yield" do
@proxy.and_yield(1).yielding.should == [[1]]
end
it "accepts multiple values to yield" do
@proxy.and_yield(1, 2, 3).yielding.should == [[1, 2, 3]]
end
end
describe MockProxy, "#raising" do
before :each do
@proxy = MockProxy.new
end
it "returns nil by default" do
@proxy.raising.should be_nil
end
it "returns the exception object passed to #and_raise" do
exc = double("exception")
@proxy.and_raise(exc)
@proxy.raising.should equal(exc)
end
it "returns an instance of RuntimeError when a String is passed to #and_raise" do
@proxy.and_raise("an error")
exc = @proxy.raising
exc.should be_an_instance_of(RuntimeError)
exc.message.should == "an error"
end
end
describe MockProxy, "#yielding" do
before :each do
@proxy = MockProxy.new
end
it "returns an empty array by default" do
@proxy.yielding.should == []
end
it "returns an array of arrays of values the proxy should yield" do
@proxy.and_yield(3)
@proxy.yielding.should == [[3]]
end
it "returns an accumulation of arrays of values the proxy should yield" do
@proxy.and_yield(1).and_yield(2, 3)
@proxy.yielding.should == [[1], [2, 3]]
end
end
describe MockProxy, "#yielding?" do
before :each do
@proxy = MockProxy.new
end
it "returns false if the proxy is not yielding" do
@proxy.yielding?.should be_false
end
it "returns true if the proxy is yielding" do
@proxy.and_yield(1)
@proxy.yielding?.should be_true
end
end
describe MockIntObject, "#to_int" do
before :each do
@int = MockIntObject.new(10)
end
it "returns the number if to_int is called" do
@int.to_int.should == 10
@int.count.should == [:at_least, 1]
end
it "tries to convert the target to int if to_int is called" do
MockIntObject.new(@int).to_int.should == 10
@int.count.should == [:at_least, 1]
end
end