我正在为一个我没有构建的应用程序编写控制器测试,所以它肯定是一个学习过程。这是我第一次遇到直接从AbstractController :: Base继承的控制器。显然,它与其他控制器的行为不同。
其格式大致为:
class SchwadGenericController < AbstractController::Base
def schwad_method var_one, var_two = nil, var_three = nil
if var_two.blank?
var_one.generic_method
end
render template: "schwad_templates/generic_template", layout: false
end
end
我尝试了正常测试,这是我目前正在进行 ANYTHING 的地方。
require 'rails_helper'
describe SchwadGenericController do
# before(:each) do
# SchwadGenericController.skip_authorize_resource
# end
# login_user
let!(:variable){ create(:my_factory_variable) }
describe 'controller methods' do
it 'should hit this method' do
binding.pry
SchwadGenericController.schwad_method(variable)
# expect(response).to_render template: "schwad_templates/generic_template"
end
end
end
这里大致是我失败的地方。
Failures:
1) SchwadGenericController controller methods should hit this method
Failure/Error: Unable to find matching line from backtrace
NoMethodError:
undefined method `request=' for # <SchwadGenericController:0x007f8022db0a20>
我在这里阅读了抽象控制器及其在rails中的角色:https://www.mobomo.com/2012/06/and-you-thought-render-farms-were-just-for-pixar/
我在这里阅读了文档:http://api.rubyonrails.org/classes/AbstractController/Base.html
我真的很感激另一组眼睛,并指导你们如何测试控制器及其方法,控制器继承自AbstractController :: Base ....我缺少什么?
-Schwad
答案 0 :(得分:2)
经过一些测试,我认为这是不可能的。控制器规范只是wrappers for Rails functional tests,它测试继承自ActionController::Base
的类。要使控制器测试运行,控制器必须支持request
和response
个对象,AbstractController::Base
不是ActionController::Base
to_render
spec/controllers
)。这就是您在运行测试时遇到特定错误的原因。出于同样的原因,您将无法使用控制器规范助手(期望),例如spec/abstract_controllers
,因为它们仅针对控制器规范定义,并且您的控制器类不是“控制器”中的“控制器”控制器规格“感觉。
您似乎唯一需要进行测试的选项是测试控制器,就像任何其他普通红宝石类一样。您需要将测试从describe 'controller methods' do
it 'should hit this method' do
c = SchwadGenericController.new
expect(c).to receive(:render).with(template: "schwad_templates/generic_template", layout: false)
c.schwad_method(variable)
end
end
目录移到其他目录,例如$btn1Pressed
然后你必须放弃所有控制器规范助手并测试只调用实例方法,例如:
http://mywebsite.com/myphp.php?btn1Pressed=1
答案 1 :(得分:1)
直接从AbstractController扩展:: Base似乎可能是错误的来源。除非你做一些非传统的事情,否则没有理由这样做。
您确定不打算从ActionController :: Base继承吗? ActionController中有一大堆模块需要渲染,这可能解释了测试中缺少方法的错误。
如果切换到ActionController :: Base不起作用。尝试从rails控制台运行app.get "/path/to/action"
。你得到同样的错误吗?