我如何测试AccountsController< AbstractedResourcesController

时间:2015-05-26 12:00:30

标签: ruby-on-rails minitest

我的应用程序将一个默认控制器抽象为一个gem(gem'抽象'),我的所有控制器都继承自抽象控制器。

# Gemfile
gem 'abstracted', path: '../../gems/abstracted'

# app/controllers/accounts_controller.rb
class AccountsController < AbstractResourcesController
end

现在,当我为这样的控制器之一编写控制器(迷你)测试时,这样:

require "test_helper"

describe AccountsController do
...

我从提示符点击 rake test 后出现此错误:

NameError: uninitialized constant AbstractResourcesController
/path_to_rails/projects/cas_server/app/controllers/accounts_controller.rb:1:in `<top (required)>'

我的test / test_helper.rb看起来像这样:

ENV["RAILS_ENV"] = "test"
require File.expand_path('../../config/environment', __FILE__)

require 'minitest/autorun'
require 'action_controller/test_case'
require 'capybara/rails'
require 'rails/test_help'
require 'minitest-rails'
require 'minitest/pride'
# require 'miniskirt'
# require 'factories'
# require 'mocha'






class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all

  # Add more helper methods to be used by all tests here...
end

class ActionController::TestCase
  include Devise::TestHelpers
end

class MiniTest::Unit::TestCase
  # include MiniTest::ActiveRecordAssertions

  # DatabaseCleaner.strategy = :transaction
  #
  # def setup
  #   DatabaseCleaner.start
  # end
  #
  # def teardown
  #   DatabaseCleaner.clean
  # end

end

class MiniTest::Spec
  include ActiveSupport::Testing::SetupAndTeardown

  # alias :method_name :__name__ if defined? :__name__

  def build_message(*args)
    args[1].gsub(/\?/, '%s') % args[2..-1]
  end
end


class ControllerSpec < MiniTest::Spec

  include ActionController::TestCase::Behavior
  include Devise::TestHelpers
  include Rails.application.routes.url_helpers

  # Rails 3.2 determines the controller class by matching class names that end in Test
  # This overides the #determine_default_controller_class method to allow you use Controller
  # class names in your describe argument
  # cf: https://github.com/rawongithub/minitest-rails/blob/gemspec/lib/minitest/rails/controller.rb
  def self.determine_default_controller_class(name)
    if name.match(/.*(?:^|::)(\w+Controller)/)
      $1.safe_constantize
    else
      super(name)
    end
  end

  before do
    @controller = self.class.name.match(/((.*)Controller)/)[1].constantize.new
    @routes = Rails.application.routes
  end

  subject do
    @controller
  end

end

# Functional tests = describe ***Controller
MiniTest::Spec.register_spec_type( /Controller$/, ControllerSpec )

1 个答案:

答案 0 :(得分:0)

describe AccountsController do之前的控制器规范文件中添加它,

module AbstractResourcesController

class Base
    def self.protect_from_forgery; end
  end
end
require 'abstract_resources_controller'