Ruby on rails 3 伯克利CS169.1 MOOC烂土豆TDD Rspec错误电影未实现:<;方法>;

Ruby on rails 3 伯克利CS169.1 MOOC烂土豆TDD Rspec错误电影未实现:<;方法>;,ruby-on-rails-3,rspec,Ruby On Rails 3,Rspec,我试图通过Esaas来介绍BerkeleyX CS169.1 MOOC类的示例,以及使用Rspec的TDD示例。当我在控制器上运行rspec时,我遇到了这个错误 我的RottenPotoES/spec/controllers/movies\u controller\u spec.rb文件: require 'rails_helper' require_relative '../app/controllers/movies_controller.rb' RSpec.describe Movie

我试图通过Esaas来介绍BerkeleyX CS169.1 MOOC类的示例,以及使用Rspec的TDD示例。当我在控制器上运行rspec时,我遇到了这个错误

我的RottenPotoES/spec/controllers/movies\u controller\u spec.rb文件:

require 'rails_helper'
require_relative '../app/controllers/movies_controller.rb'


RSpec.describe MoviesController, type: :controller do
  describe 'searching TMDb' do
    it 'should call the model method that performs TMDb search' do
      allow(Movie).to receive(:show)
    end
  end
我的RottnPotoES/app/controllers/movies\u controller.rb

class MoviesController < ApplicationController

  def show
  end

end
我的档案摘录:

ruby '2.2.2'
gem 'rails', '4.2.1'
group :development, :test do
  gem 'sqlite3'
  gem 'rspec-rails', '3.3.2'
  gem 'ZenTest', '4.11.0'
end

group :test do
  gem 'cucumber-rails', :require => false
  gem 'cucumber-rails-training-wheels'
end
我已经研究过这个线程,我不认为这是一个实例与类方法的问题

此外,我真的不需要:

require_relative '../app/controllers/movies_controller.rb'

(由于我的rspec文件中的“约定优先于配置”),对吗?

我想您可能正在寻找以下内容:

before(:each) do
  @results = [mock('movie_one'), mock('movie_two')]
end

it 'should call the model method that performs TMDb search' do
  Movie.should_receive(:find_in_tmdb).with('hardware').
    and_return(@results)
  post :search_tmdb, {:search_terms => 'hardware'}
end
可以用RSpec 3语法重写为:

allow(Movie).to receive(:find_in_tmdb).with(hardware).and_return(@results)

你能解决这个问题吗?这里也有同样的问题。我从rspec:Failure/Error:allow(Movie)。接收(:find_in_tmdb)。使用('hardware')。返回(假结果)Movie。。。未实现:find_in_tmdb//因为我正在测试控制器,为什么rspec关心movie方法的实现?请检查您的movie模型中是否定义了一个实例方法(def find_in_tmbd),该方法返回正确的返回值。RSpec关心模型的实现,可能是因为您正在测试的控制器操作正在调用模型中定义的实例方法。在我看来,这正是问题所在。据我所知,控制器规范不应该关心模型的实现,并且接收应该覆盖现有的方法。
allow(Movie).to receive(:find_in_tmdb).with(hardware).and_return(@results)