2016-11-18 144 views
1

我想添加一个功能,返回通过点击一个按钮,属于一个导演的所有电影的信息。它已经实现并且运行良好,但是在编写Rspec测试时出现了一些错误。该错误信息是:找不到路径的Rspec的无路由匹配错误

(1)MoviesController searching for movies by the same director when 'Director' info exists should post @director and @movies variables for view 
Failure/Error: get :find_movies_by_same_director, :movie_id => @movie.id, :movie_director => @movie.director 

ActionController::RoutingError: 
    No route matches {:movie_id=>"1", :movie_director=>["Star Wars", "THX-1138"], :controller=>"movies", :action=>"find_movies_by_same_director"} 

# ./spec/controllers/movie_controller_spec.rb:15:in `block (4 levels) in <top (required)>' 

类似的错误发生,所有下面的测试,所以我觉得可能是我的路线文件的一些问题。下面是我在routes.rb中指定路径:

get '/movies/:id/director', to: 'movies#find_movies_by_same_director', as: 'director' 

而Rspec的文件:

require "spec_helper" 

describe MoviesController do 
it { should respond_to(:find_movies_by_same_director) } 

describe "searching for movies by the same director" do 
    context "when 'Director' info exists" do 
    before do 
     @movie = double(:title => "Star Wars", :id => "1", :director => "George Lucas") 
     Movie.stub(:find).with("1").and_return @movie 
     @lucas_films = ["Star Wars", "THX-1138"] 
     @movie.stub(:director).and_return @lucas_films 
    end 
    it "should post @director and @movies variables for view" do 
     get :find_movies_by_same_director, :movie_id => @movie.id 
     assigns(:director).should == @movie.director 
     assigns(:movies).should == @lucas_films 
    end 
    end 
end 

控制器的方法是:

def find_movies_by_same_director 
    @movie = Movie.find(params[:id]) 
    @director = @movie.director 
    if (not @director.nil?) and (not @director.empty?) 
    @movies = Movie.where(director: @director) if (not @director.nil?) and (not @director.empty?); 
    #@movies = Movie.find_by_sql("SELECT * FROM movies i WHERE i.director == '#{@director}'") 
    render :director 
    else 
    flash[:notice] = "'#{@movie.title}' has no director info" 
    redirect_to root_path 
end 

我刚开始学习Rspec的,所以任何意见或建议表示赞赏。

回答

1

因为它可以在路线中可以看出,你的动作需要一个参数:id。改为传递:movie_id。因此,只需更换这条线在规范

get :find_movies_by_same_director, :movie_id => @movie.id 

get :find_movies_by_same_director, :id => @movie.id 

,然后再试一次。

相关问题