Rails中的匿名控制器

时间:2018-11-29 08:22:03

标签: ruby-on-rails

我目前正在学习使用rspec(红宝石)进行测试(可以肯定的是,我知道的很少),并且在使用匿名控制器进行测试时会有些卡住。我尝试使用Google搜索,但感觉好像没有给我想要的东西。因此,基本上,什么是匿名控制器?为什么(或何时)需要一个匿名控制器?

预先感谢

1 个答案:

答案 0 :(得分:0)

您想使用匿名控制器的主要原因是,您正在开发可插入任何任意控制器的可重用库代码(gem)。

例如,此基本控制器类用于干燥常见的CRUD样板代码:

module MyGem
  class ResourcefulController < ::ActionController::Base
    before_action :set_resource, only: [:show, :edit, :update, :destroy]

    def show
    end

    private

    def derive_resource_class_name
      self.class.name.demodulize.chomp('Controller').singularize
    end

    def resource_class
      derive_resource_class_name.constantize
    end

    def set_resource
      @resource = resource_class.find(params[:id])
    end
  end
end

正常的测试方法需要我们为测试本身创建一个控制器和一条路由。

通过使用匿名控制器,我们可以解决此问题:

require 'rails_helper'

RSpec.describe MyGem::ResourcefulController, type: :controller do
  controller do
    def show
      render plain: @resource
    end
  end
  before do
    model = Class.new do
      def self.find(id)
        "You found me"
      end
    end
    stub_const("Resourceful", model)
  end
  it "derives the resource class from the name of the controller" do
    get :show, params: { id: 1 }
    expect(response.body).to eq "You found me"
  end
end

RSpec还可以为常规的CRUD动作巧妙地创建存根路由。

但是对于普通的Rails应用程序代码来说,它根本不是很有用-通过创建覆盖最终产品中实际行为的请求或功能规范,可以更好地测试父类(或包含的模块)。这样一来,您可以创建失败的规范,并变为绿色,然后进行重构。