2010-03-30 6 views
20

Je ne suis pas nouveau à Rails ou Rspec, mais je suis nouveau à faire des gemmes. Lorsque je teste mes contrôleurs, les méthodes REST "get", "post", "put", "delete" me donnent une erreur de méthode non définie.Pourquoi les méthodes RSpec, "get", "post", "put", "delete" ne fonctionnent pas dans une spécification de contrôleur dans une gemme (ou en dehors de Rails)?

Ci-dessous vous trouverez le code, mais si vous préférez le voir dans un pâté, click here.

Merci!

Voici mon 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 

Mon 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 

Mon contrôleur d'abonnements:


class SubscriptionsController < ActionController::Base 
    def index 
    end 
end 

L'erreur:


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: 

Répondre

28

Parce que ces méthodes n'appartiennent pas à Rspec mais à Rails. Lorsque vous décrivez un contrôleur, il hérite de Spec::Rails::Example::ControllerExampleGroup, qui hérite de FunctionalExampleGroup, qui hérite de ActionController :: TestCase des rails.

Si vous regardez ActionController::TestCase's documentation, vous trouverez que les méthodes get/post/put/delete sont définies. Par conséquent, si vous souhaitez accéder à ces méthodes en dehors de Rails, vous devez les redéfinir.

+0

Merci Damien. C'est la réponse que je cherchais. :) –

+11

où et comment les "redéfinissez-vous"? – botbot

+0

Une méthode est une méthode. Vous devriez donc pouvoir le redéfinir dans n'importe quel module et l'inclure dans vos spécifications –

9

Ajout: type => contrôleur pour décrire comme suit travaillé pour moi

describe TestController, :type => :controller do 
    # ur stuff 
end 
+0

Je vais essayer ça. Mais vous avez répondu à mon autre question ici: http://stackoverflow.com/questions/2577372/test-with-rspec-a-controller-horside-of-a-rails-environment.Je vais essayer, si ça marche (je suis sûr que ce sera le cas), je vais choisir le vôtre, si vous décidez d'y ajouter votre réponse. :) –

+0

devrait être: type =>: contrôleur dans rspec 2.11 qui est – huug

+0

@huug - merci, édité. –

0

J'avais ce problème avec un bijou que je fais pour un système Rails 2.3.8. J'ai alors réalisé que j'utilisais une version de Rspec-Rails supérieure à la version 2.0, alors que je devrais utiliser la dernière version de Rspec-Rails-1.3 (version 1.3.4).

J'ai désinstallé tous les gems liés à RSpec-Rails v2 (rspec-core, rspec-attentes, rspec-mocks, etc), configuré mon Gemfile avec la version 1.3.4, et lancé 'bundle install'. J'utilise une application Rails 2.3.8 factice dans spec/dummy configuré pour utiliser Bundler, et avec un Gemfile configuré avec les mêmes dépendances gemme que mes gemmes Gemfile (qui saisit les gemmes du fichier gemspec). J'ai exécuté 'script/generate rspec' pour générer les fichiers/dossiers RSpec pour Rails, que j'ai référencé pour faire les configurations appropriées dans mes fichiers Rakefile et spec_helper.