[rspec-users] How Can I inveke a code example in another one

David Chelimsky dchelimsky at gmail.com
Wed Oct 28 07:39:54 EDT 2009


On Oct 28, 2009, at 2:56 AM, zhjie685 wrote:

> Hi,
>   I'm new to rspec.
>   How could I transform the Unit:Tests code like
>
> def test_logout
>     login
>     get :logout
>     assert_not_logged_in
>  end
>  def assert_not_logged_in
>     assert_block { session["user"].nil? }
>  end
>
> that a test method invoke another test method,to repec code.
>
> Should I put them in one code example? or there is other way?
>
> Thanks!


Instead of assertions, RSpec uses expectations, like this:

   describe "GET /logout" do
     it "removes the user from the session" do
       login
       get :logout
       session["user"].should be_nil
     end
   end

An expectation has two parts: should() or should_not(), and a matcher.  
In this case, be_nil() is a matcher that's built in to RSpec. You can  
also write your own, using RSpec's matcher DSL:

   Spec::Matchers.define :be_logged_out do
     match do |session|
       session["user"].nil?
     end
   end

   describe "GET /logout" do
     it "ends the user session" do
       login
       get :logout
       session.should be_logged_out
     end
   end

Or you could write a be_logged_in matcher and use it with should_not,  
like this:

   Spec::Matchers.define :be_logged_in do
     match do |session|
       !!session["user"]
     end
   end

   describe "GET /logout" do
     it "ends the user session" do
       login
       get :logout
       session.should_not be_logged_in
     end
   end

Check out the following for more info:

   http://wiki.github.com/dchelimsky/rspec/custom-matchers
   http://github.com/dchelimsky/rspec/tree/master/features/matchers/

and, of course:

   http://www.pragprog.com/titles/achbd/the-rspec-book

HTH,
David



More information about the rspec-users mailing list