我目前正在学习使用rspec(红宝石)进行测试(可以肯定的是,我知道的很少),并且在使用匿名控制器进行测试时会有些卡住。我尝试使用Google搜索,但感觉好像没有给我想要的东西。因此,基本上,什么是匿名控制器?为什么(或何时)需要一个匿名控制器?
预先感谢
答案 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应用程序代码来说,它根本不是很有用-通过创建覆盖最终产品中实际行为的请求或功能规范,可以更好地测试父类(或包含的模块)。这样一来,您可以创建失败的规范,并变为绿色,然后进行重构。