I’ve been taking the SaaS course, and in Chapter 4 we’re supposed to use Cucumber. I followed all the instructions and watched the screencast showing how everything worked, but still I’m stuck with this error:
Scenario: Add a movie # features/AddMovie.feature:3
Given I am on the RottenPotatoes home page # features/step_definitions/web_steps.rb:44
When I follow "Add new movie" # features/step_definitions/web_steps.rb:56
Then I should be on the Create New Movie page # features/step_definitions/web_steps.rb:230
When I fill in "Title" with "Men In Black" # features/step_definitions/web_steps.rb:60
And I select "PG-13" from "Rating" # features/step_definitions/web_steps.rb:85
And I press "Save Changes" # features/step_definitions/web_steps.rb:52
Then I should be on the RottenPotatoes home page # features/step_definitions/web_steps.rb:230
<"/movies"> expected but was
<"/movies/1">. (MiniTest::Assertion)
./features/step_definitions/web_steps.rb:235:in `/^(?:|I )should be on (.+)$/'
features/AddMovie.feature:10:in `Then I should be on the RottenPotatoes home page'
And I should see "Men In Black" # features/step_definitions/web_steps.rb:105
Failing Scenarios:
cucumber features/AddMovie.feature:3 # Scenario: Add a movie
Feature: User can manually add movie
Scenario: Add a movie
Given I am on the RottenPotatoes home page
When I follow "Add new movie"
Then I should be on the Create New Movie page
When I fill in "Title" with "Men In Black"
And I select "PG-13" from "Rating"
And I press "Save Changes"
Then I should be on the RottenPotatoes home page
And I should see "Men In Black"
and the code snippet in path.rb
def path_to(page_name)
case page_name
when /^the home\s?page$/
'/'
when /^the RottenPotatoes home page/
movies_path
when /^the Create New Movie page/
new_movie_path
end
movies_controller.rb
class MoviesController < ApplicationController
def index
@movies = Movie.all( :order => "title" )
end
def show
id = params[ :id ] # retrieve movie ID from URI route
begin
@movie = Movie.find( id )
rescue
flash[ :warning ] = "The movie was not found."
redirect_to movies_path
end
# will render app/views/movies/show.html.haml by default
end
def new
# default: render 'new' template
end
def create
@movie = Movie.create( params[ :movie ] )
flash[ :notice ] = "#{ @movie.title } was successfully created."
redirect_to movie_path( @movie.id )
end
def edit
id = params[ :id ]
@movie = Movie.find_by_id( id )
end
def update
@movie = Movie.find_by_id params[ :id ]
@movie.update_attributes!( params[ :movie ] )
flash[ :notice ] = "#{ @movie.title } was successfully updated."
redirect_to movie_path( @movie )
end
def destroy
@movie = Movie.find( params[ :id ] )
@movie.destroy
flash[ :notice ] = "Movie '#{ @movie.title }' deleted."
redirect_to movies_path
end
end
Judging from what you’ve posted, it looks like your code and your tests don’t line up. In your test you specify that after saving a new movie:
Which, judging from your path.rb file, looks like it translates to “should be on the movies index page”. However in your code, you don’t redirect to the movies index page at the end of the create action, you redirect to the show page for the movie that was just created. Which would explain why cucumber complains that it expects
<"/movies">(the movies index page) but got<"/movies/1">(the page for a movie withid = 1).Here’s your create action:
See in the last line you have
redirect_to movie_path(@movie.id), which tells rails to send you to the page for the movie@movie. That makes sense and is often what you want (i.e. after a user creates a new record, you show them the record they created), but it’s also possible that you want to redirect them to the index page where they can see the movie they added with all the other movies. The solution will be different depending on which result you want.Assuming your test is correct, you need to change the last line in your
createaction to:Hope that helps!