Почему методы RSpec «get», «post», «put», «delete» не работают в спецификации контроллера в геме (или вне Rails)? - PullRequest
20 голосов
/ 30 марта 2010

Я не новичок в Rails или Rspec, но я новичок в создании драгоценных камней. Когда я тестирую свои контроллеры, методы REST "get", "post", "put", "delete" выдают мне неопределенную ошибку метода.

Ниже вы найдете код, но если вы предпочитаете видеть его в виде картинки, нажмите здесь .

Спасибо!

Вот мой spec_helper:


$LOAD_PATH.unshift(File.dirname(__FILE__))
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
require 'rubygems'
require 'active_support' unless defined? ActiveSupport # Need this so that mattr_accessor will work in Subscriber module
require 'active_record/acts/subscribable'
require 'active_record/acts/subscriber'
require 'action_view'
require 'action_controller' # Since we'll be testing subscriptions controller
#require 'action_controller/test_process'
require 'spec'
require 'spec/autorun'


# Need active_support to user mattr_accessor in Subscriber module, and to set the following inflection
ActiveSupport::Inflector.inflections do |inflect|
  inflect.irregular 'dorkus', 'dorkuses'
end                     

require 'active_record' # Since we'll be testing a User model which will be available in the app

# Tell active record to load the subscribable files
ActiveRecord::Base.send(:include, ActiveRecord::Acts::Subscribable)
ActiveRecord::Base.send(:include, ActiveRecord::Acts::Subscriber)


require 'app/models/user' # The user model we expect in the application
require 'app/models/person'
require 'app/models/subscription'
require 'app/models/dorkus'
require 'app/controllers/subscriptions_controller' # The controller we're testing
#... more but I think irrelevant

Мои подписки_spec:


require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')

describe SubscriptionsController, "on GET index" do
  load_schema

  describe ", when only subscribable params are passed" do
    it "should list all the subscriptions of the subscribable object"
  end

  describe ", when only subscriber params are passed" do
    it "should list all the subscriptions of the subscriber" do
      u = User.create
      d1 = Dorkus.create
      d2 = Dorkus.create
      d1.subscribe! u
      d2.subscribe! u

      get :index, {:subscriber_type => "User", :subscriber_id => u.id}
      assigns[:subscriptions].should == u.subscriptions
    end
  end
end

Контроллер моих подписок:


class SubscriptionsController < ActionController::Base
  def index
  end
end

Ошибка:


NoMethodError in 'SubscriptionsController on GET index , when only subscriber params are passed should list all the subscriptions of the subscriber'
undefined method `get' for #
/home/ramon/rails/acts_as_subscribable/spec/controllers/subscriptions_controller_spec.rb:21:

Ответы [ 4 ]

28 голосов
/ 30 марта 2010

Поскольку эти методы принадлежат не Rspec, а Rails.

Когда вы описываете контроллер, он наследует от Spec :: Rails :: Example :: ControllerExampleGroup , который наследует FunctionalExampleGroup , который наследует рельсы ActionController :: TestCase.

Если вы посмотрите на документацию ActionController :: TestCase , вы обнаружите, что здесь определены методы get / post / put / delete.

Так что если вы хотите получить доступ к этим методам вне Rails, вам нужно переопределить их.

9 голосов
/ 20 апреля 2010

Добавление: type => контроллер для описания следующим образом работал для меня

describe TestController, :type => :controller do
    # ur stuff
end
5 голосов
/ 01 декабря 2010

Ссылка из принятого ответа выше теперь не работает. Вот обновленная ссылка (для 2.3.8) http://api.rubyonrails.org/v2.3.8/classes/ActionController/TestCase.html

0 голосов
/ 24 мая 2012

У меня была эта проблема с гемом, который я делаю для системы Rails 2.3.8. Затем я понял, что использую версию Rspec-Rails выше 2.0, когда я должен использовать последнюю версию Rspec-Rails-1.3 (версия 1.3.4).

Я удалил все гемы, связанные с RSpec-Rails v2 (rspec-core, rspec-ожидания, rspec-mocks и т. Д.), Настроил свой Gemfile с v1.3.4 и запустил 'bundle install'.

Я использую фиктивное приложение Rails 2.3.8 в spec / dummy, настроенном на использование Bundler, и с Gemfile, сконфигурированным с теми же зависимостями gem, что и мой gem Gemfile (который извлекает драгоценные камни из файла gemspec). *

Я запустил 'script / generate rspec', чтобы сгенерировать файлы / папки RSpec для Rails, на которые я ссылался, чтобы сделать соответствующие конфигурации в моих гемах Rakefile и файле spec_helper.

...