2010-03-30 13 views
20

Non sono nuovo di Rails o di Rspec, ma sono nuovo nel creare gemme. Quando provo i miei controller, i metodi REST "get", "post", "put", "delete" mi danno un errore del metodo non definito.Perché i metodi di RSpec, "get", "post", "put", "delete" funzionano in una specifica del controller in una gemma (o all'esterno di Rails)?

Sotto troverai il codice, ma se preferisci vederlo in un pastie, click here.

Grazie!

Ecco la mia 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 

mio 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 

mie opzioni di controllo:


class SubscriptionsController < ActionController::Base 
    def index 
    end 
end 

L'errore:


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: 

risposta

28

Poiché questi metodi non appartengono a Rspec ma a Rails.

Quando si descrive un controller, esso eredita da Spec::Rails::Example::ControllerExampleGroup, che eredita FunctionalExampleGroup, che eredita ActionController :: TestCase delle guide.

Se si guarda a ActionController::TestCase's documentation, troverete che è dove sono definiti i metodi get/post/put/delete.

Quindi, se si desidera accedere a questi metodi al di fuori di Rails, è necessario ridefinirli.

+0

Grazie Damien. Questa è la risposta che stavo cercando. :) –

+11

dove e come "ridefinirli"? – botbot

+0

Un metodo è un metodo. Quindi dovresti essere in grado di ridefinirlo in qualsiasi modulo e includerlo nelle tue specifiche –

9

Aggiunta: type => Controller per descrivere nel seguente modo ha lavorato per me

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

Ci proverò. Ma hai risposto alla mia altra domanda qui: http://stackoverflow.com/questions/2577372/test-with-rspec-a-controller-outside-of-a-rails-environment.Lo proverò allora se funziona (sono abbastanza sicuro che lo farà), sceglierò il tuo, se decidi di aggiungere la tua risposta lì. :) –

+0

dovrebbe essere: type =>: controller in rspec 2.11 che è – huug

+0

@huug - grazie, modificato. –

0

Stavo avendo questo problema con un gioiello che sto facendo per un sistema Rails 2.3.8. Mi sono poi reso conto che stavo usando una versione di Rspec-Rails sopra 2.0, quando dovrei usare l'ultima versione di Rspec-Rails-1.3 (versione 1.3.4).

Ho disinstallato tutte le gemme relative a RSpec-Rails v2 (rspec-core, rspec-expectations, rspec-mocks, ecc.), Ho configurato il mio Gemfile con v1.3.4 e ho eseguito "bundle install".

Sto usando un'app fittizia Rails 2.3.8 in spec/dummy configurata per utilizzare Bundler e con un Gemfile configurato con le stesse dipendenze gemma delle gemme Gemfile (che acquisisce le gemme dal file gemspec).

Ho eseguito 'script/generate rspec' per generare i file/cartelle RSpec per Rails, a cui ho fatto riferimento per creare le configurazioni appropriate nei miei file Rakefile e spec_helper.

Problemi correlati