Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why don't RSpec's methods, "get", "post", "put", "delete" work in a controller spec in a gem (or outside Rails)?

I'm not new to Rails or Rspec, but I'm new to making gems. When I test my controllers, the REST methods "get", "post", "put", "delete" give me an undefined method error.

Below you'll find code, but if you prefer to see it in a pastie, click here.

Thanks!

Here's my 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

My subscriptions_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

My subscriptions controller:


class SubscriptionsController < ActionController::Base
  def index
  end
end

The error:


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:
like image 242
Ramon Tayag Avatar asked Mar 30 '10 08:03

Ramon Tayag


3 Answers

Because these methods don't belong to Rspec but to Rails.

When you describe a controller, it inherits from Spec::Rails::Example::ControllerExampleGroup, which inherits FunctionalExampleGroup, which inherits the rails' ActionController::TestCase.

If you look at ActionController::TestCase's documentation you'll find that's where the get/post/put/delete methods are defined.

So if you want to get access to these methods outside of Rails, you need to redefine them.

like image 168
Damien MATHIEU Avatar answered Dec 09 '22 14:12

Damien MATHIEU


Adding :type => controller to describe as follows worked for me

describe TestController, :type => :controller do
    # ur stuff
end
like image 27
Alok Swain Avatar answered Dec 09 '22 13:12

Alok Swain


The link from the accepted answer above is now broken. Here's the updated link (for 2.3.8) http://api.rubyonrails.org/v2.3.8/classes/ActionController/TestCase.html

like image 43
John Hinnegan Avatar answered Dec 09 '22 12:12

John Hinnegan