Problem with stories_controller_test

I am trying to run functional tests using stories_controller_test as explained in
Simply Rails 2 p. 186 the code is below. The second test fails. Any ideas why?
This is the test

require 'test_helper'

class storiesControllerTest < ActionController::TestCase
  def test_should_show_index
    get :index
    assert_response :success
    assert_template 'index'
    assert_not_nil assigns(:story)
  end
  def test_should_show_new
    get :new
    assert_response :success
    assert_template 'new'
    assert_not_nil assigns(:story)
  end
  
  
end

This is the error

Started
.F..
Finished in 0.074679 seconds.

  1) Failure:
test_should_show_new(StoriesControllerTest) [/test/functional/stories_controller_test.rb:12]:
Expected response to be a <:success>, but was <302>

4 tests, 6 assertions, 1 failures, 0 errors

And this is what happens in the terminal when you go to the relevant pages

Processing storiesController#index (for 127.0.0.1 at 2010-01-19 15:21:15) [GET]
  User Load (0.6ms)   SELECT * FROM "users" WHERE ("users"."id" = 1) LIMIT 1
  Entry Load (1.6ms)   SELECT * FROM "stories" 
Rendering template within layouts/application
Rendering stories/index
  CACHE (0.0ms)   SELECT * FROM "users" WHERE ("users"."id" = 1) LIMIT 1
Completed in 44ms (View: 22, DB: 2) | 200 OK [http://localhost/stories/]


Processing storiesController#new (for 127.0.0.1 at 2010-01-19 15:22:56) [GET]
  User Load (0.6ms)   SELECT * FROM "users" WHERE ("users"."id" = 1) LIMIT 1
Rendering template within layouts/application
Rendering stories/new
  CACHE (0.0ms)   SELECT * FROM "users" WHERE ("users"."id" = 1) LIMIT 1
Completed in 24ms (View: 5, DB: 1) | 200 OK [http://localhost/stories/new]

Can you please show the code in your controller?

class storiesController < ApplicationController
  before_filter :login_required, :only => [ :new, :create ]
  

  def index
    @story = story.find(:all)
  end

  def new
    @story = story.new
  end

  def show
    @story = story.find(params[:id])
  end

  def edit
    @story = story.find(params[:id])
  end

  def update
    @story = story.find(params[:id])
    @story.update_attributes(params[:story])
    render :action => 'show'
  end

  def create
    if session[:user_id]
    @story = story.new(params[:story])
    @current_user = User.find_by_id(session[:user_id])
    @story.user_id = @current_user.login
          if @story.save
            flash[:notice] = 'story was successfully created.'
          redirect_to(@story) 
          end
    else
      redirect_to stories_path
    end
  end

  def destroy
    @story = story.find(params[:id])
    @story.destroy

    redirect_to(stories_path)
  end
end

Here’s my best guess.

The test results are failing because instead of getting an HTTP 200 response, you are getting HTTP 302. The reason you are getting the 302 (which is the code for redirect) is the before_filter :login_requried. The login_required action checks to see if the user is logged in, if yes, you pass to new action and get the 200 code, but if the user is not logged in you get redirected to the login page (302). If you comment out the before filter and run the test, I think it would pass.

Just checked the Rails 2 book and the test that include the additional code required to pass with the login/logout functionality enabled on the StoriesController begins on pg 297. It looks like you would need to add one line of code to the test to get it to work.

Thanks that did the trick. My fault, I created the whole app without looking at the book and never considered that the user tests affected the story tests.