Rspec控制器在Rails中测试一个继承自AbstractController :: Base的控制器

时间:2016-03-29 14:59:06

标签: ruby-on-rails ruby rspec factory-bot

我正在为一个我没有构建的应用程序编写控制器测试,所以它肯定是一个学习过程。这是我第一次遇到直接从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

2 个答案:

答案 0 :(得分:2)

经过一些测试,我认为这是不可能的。控制器规范只是wrappers for Rails functional tests,它测试继承自ActionController::Base的类。要使控制器测试运行,控制器必须支持requestresponse个对象,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"。你得到同样的错误吗?