ruby on rails - matchers - ¿Por qué los métodos de RSpec, "obtener", "publicar", "poner", "eliminar" no funcionan en una especificación de controlador en una gema(o fuera de Rails)?
rspec rails 5 (4)
Agregando: escriba => controlador para describir lo siguiente, funcionó para mí
describe TestController, :type => :controller do
# ur stuff
end
No soy nuevo en Rails o Rspec, pero soy nuevo en hacer gemas. Cuando pruebo mis controladores, los métodos REST "get", "post", "put", "delete" me dan un error de método no definido.
A continuación encontrará el código, pero si prefiere verlo en una pastelería, haga clic aquí .
¡Gracias!
Aquí está mi 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
Mis suscripciones_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
Mi controlador de suscripciones:
class SubscriptionsController < ActionController::Base
def index
end
end
El 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:
El enlace de la respuesta aceptada anterior ahora está roto. Aquí está el enlace actualizado (para 2.3.8) http://api.rubyonrails.org/v2.3.8/classes/ActionController/TestCase.html
Estaba teniendo este problema con una gema que estoy creando para un sistema Rails 2.3.8. Entonces me di cuenta de que estaba usando una versión de Rspec-Rails por encima de 2.0, cuando debería usar la última versión de Rspec-Rails-1.3 (versión 1.3.4).
Desinstalé todas las gemas relacionadas con RSpec-Rails v2 (rspec-core, rspec-expectations, rspec-mocks, etc.), configuré mi Gemfile con v1.3.4 y ejecuté ''bundle install''.
Estoy usando una aplicación dummy Rails 2.3.8 en spec / dummy configurada para usar Bundler, y con un Gemfile configurado con las mismas dependencias de gemas que mis gemas Gemfile (que toma las gemas del archivo gemspec)
Ejecuté ''script / genera rspec'' para generar los archivos / carpetas RSpec para Rails, a los que hice referencia para realizar las configuraciones adecuadas en mis gemas Rakefile y spec_helper file.
Porque estos métodos no pertenecen a Rspec sino a Rails.
Cuando describe un controlador, hereda de Spec::Rails::Example::ControllerExampleGroup , que hereda FunctionalExampleGroup , que hereda ActionController :: TestCase de los rieles.
Si observa la documentación de ActionController :: TestCase , encontrará que es allí donde se definen los métodos de obtención / publicación / colocación / eliminación.
Entonces, si desea obtener acceso a estos métodos fuera de Rails, debe redefinirlos.