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

_______________________________________________
rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to