RAILS& RSpec:期待<" similar_movies">但使用< []>

时间:2016-07-18 20:01:04

标签: ruby-on-rails rspec

这是.spec文件:

describe MoviesController do
    describe 'similar_movies' do
        before :each do
            @fake_results = [double('movie1'), double('movie2')]
        end
        it 'should call the model method that searches similar movies' do
            expect(Movie).to receive(:similar_movies).with("1").
            and_return @fake_results
            get :similar_movies, :id => 1
        end
        it 'should select the similar_movies template for rendering' do
            Movie.stub(:similar_movies).and_return(@fake_results)
            expect(response).to render_template(:similar_movies)
            get :similar_movies, :id => 1
        end
        # it 'should make the similar_movies results avaliable to that template'do

        # end
    end

这是控制器动作:

 # METHOD TO FIND MOVIES WITH THE SAME DIRECTOR AS A GIVEN ONE
   def similar_movies
    @similar_movies_arr = Movie.similar_movies(params[:id])
    #render 'similar_movies'
   end

这是模型方法:

    def self.similar_movies(id)
    movie = Movie.find(id)
    director = movie['director']
    @similar_movies_arr = []
    @similar_movies = Movie.where(["director = ?", "#{director}"])
    @similar_movies.each do |m|
      @similar_movies_arr << m
    end
    return @similar_movies_arr
  end

这个模板:

    -@similar_movies_arr.each do |movie|
  %h1= movie.title

这很简单,我使用RSpec的第一步,但它失败了。请有人帮我理解这个错误

MoviesController similar_movies should select the similar_movies template for rendering
 Failure/Error: expect(response).to render_template(:similar_movies)
   expecting <"similar_movies"> but rendering with <[]>

1 个答案:

答案 0 :(得分:0)

主要问题是你需要在期望渲染模板之前进行获取。

  get :similar_movies, :id => 1
  expect(response).to render_template(:similar_movies)

您的测试仍然会出现问题,因为您没有要搜索的假电影,您可以访问导演字段。您可能希望查看工厂以创建一些测试影片。

第三条评论是你可能想要从使用Movie.stub切换到允许(电影)的新格式。接收...就像之前的预期只是使用切换allow for expect