这是.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 <[]>
答案 0 :(得分:0)
主要问题是你需要在期望渲染模板之前进行获取。
get :similar_movies, :id => 1
expect(response).to render_template(:similar_movies)
您的测试仍然会出现问题,因为您没有要搜索的假电影,您可以访问导演字段。您可能希望查看工厂以创建一些测试影片。
第三条评论是你可能想要从使用Movie.stub切换到允许(电影)的新格式。接收...就像之前的预期只是使用切换allow for expect