我对Rails或Rspec并不陌生,但是对制作 gem 却不陌生。当我测试 Controller 时,REST方法“get”,“post”,“put”,“delete”给我一个未定义的方法错误。

在下面,您会找到代码,但是,如果您希望在粘贴文件click here中查看它,则可以找到代码。

谢谢!

这是我的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

我的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

我的订阅 Controller :

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:

最佳答案

因为这些方法不属于Rspec,但属于Rails。

当您描述一个 Controller 时,它继承自Spec::Rails::Example::ControllerExampleGroup,后者继承FunctionalExampleGroup,后者继承了rails的ActionController::TestCase。

如果查看ActionController::TestCase's documentation,您会发现定义了get / post / put / delete方法。

因此,如果您想在Rails之外访问这些方法,则需要重新定义它们。

关于ruby-on-rails - 为什么RSpec的方法 “get”, “post”, “put”, “delete”无法在gem(或Rails外部)的 Controller 规范中工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2543885/

10-11 02:46