RSpecial

Setup

First we need to require the library.

require 'rspecial'

This will load Assay and the RSpec extension, which will add #should and #should_not to BasicObject class, and create a module called RSpecial::Matchers. This moudle is included into Assay::Matchers. To make use of it, we simply need to include either of these modules into our test scope.

include ::Assay::Matchers

With that in place, we are ready to use the matchers.

RSpec Should Method

should

Becuase the #should method used =~ as the assertion operator, you can do something a bit unexpected, such as,

'a'.should /a/

should=

10.should = 10

expect ::EqualAssay do
  10.should = 20
end

10.should_not = 20

RSpec Matchers

should equal

1.should = 1

expect ::EqualAssay do

1.should = 2

end

be_true

true.should be_true

expect ::TrueAssay do

false.should be_true

end

be_false

false.should be_false

expect ::FalseAssay do

true.should be_false

end

be_nil

nil.should be_nil

expect ::NilAssay do

true.should be_nil

end

be_empty

[].should be_empty

expect ::EmptyAssay do

[1].should be_empty

end

[1].should_not be_empty

be_close

1.should be_close(1.5, 2)

expect ::WithinAssay do

1.should be_close(0.5, 2)

end

1.should_not be_close(0.5, 2)

match

"abc".should match(/a/)

expect ::MatchAssay do

"abc".should match(/x/)

end

"abc".should_not match(/g/)

eql

1.should eql(1)

expect ::EqualityAssay do

1.should eql(1.0)

end

1.should_not eql(1.0)

equal

:a.should equal(:a)

expect ::IdentityAssay do

"a".should equal("a")

end

:a.should_not equal('a')

be_instance_of

1.should be_instance_of(Fixnum)

expect ::InstanceAssay do

1.should be_instance_of(String)

end

1.should_not be_instance_of(String)

be_kind_of

1.should be_kind_of(Integer)

expect ::KindAssay do

1.should be_kind_of(String)

end

1.should_not be_kind_of(String)

raise_error

procedure = lambda{ raise ::ArgumentError }

procedure.should raise_error(::ArgumentError)

expect ::RaiseAssay do

procedure.should raise_error(::TypeError)

end

procedure.should_not raise_error(::TypeError)

respond_to

"string".should respond_to(:upcase)

expect ::RespondAssay do

"string".should respond_to(:not_a_method)

end

"string".should_not respond_to(:not_a_method)

satisfy

5.should satisfy{ |x| x > 3 }

expect ::ExecutionAssay do

5.should satisfy{ |x| x < 3 }

end

5.should_not satisfy{ |x| x < 3 }

throw_symbol

procedure = lambda{ throw :foo }

procedure.should throw_symbol(:foo)

expect ::ThrowAssay do

procedure.should throw_symbol(:bar)

end

procedure.should_not throw_symbol(:bar)

Supplemental Matchers

equate_to

This is not strictly an RSpec matcher, but we have thrown it in for good measure. It is equivalent to using the #should= method.

10.should equate_to(10)

expect ::EqualityAssay do

10.should equate_to(10.0)

end

10.should_not equate_to(10.0)

be_like

The #be_like matcher is not strictly an RSpec matcher, but we have thrown it in for good measure.

/a/.should be_like('a')

expect ::LikeAssay do

/a/.should be_like('b')

end

/a/.should_not be_like('b')

Have

The #have matchers make it easy to set expectations about the size of a collection. In general the term items is used if the target object is a collection.

a = [1, 2, 3]

a.should have(3).items
a.should_not have(2).items
a.should_not have(4).items

a.should have_exactly(3).items
a.should_not have_exactly(2).items
a.should_not have_exactly(4).items

a.should have_at_least(2).items
a.should have_at_most(4).items

But a method that returns a collection can be used instead.

class String
  def words
    split(' ')
  end
end

s = "a sentence with some words"

s.should have(5).words
s.should_not have(4).words
s.should_not have(6).words

s.should have_exactly(5).words
s.should_not have_exactly(4).words
s.should_not have_exactly(6).words

s.should have_at_least(4).words
s.should have_at_most(6).words

Besides #have there is also #have_at_least and #have_at_most.

a = [1, 2, 3]

a.should have_at_least(2).items
a.should have_at_most(4).items

a.should have_at_least(3).items
a.should have_at_most(3).items