【问题标题】:Rspec Controller testing in Rails a controller that inherits from AbstractController::BaseRspec Controller 在 Rails 中测试一个继承自 AbstractController::Base 的控制器
【发布时间】:2016-03-29 14:59:05
【问题描述】:

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

我尝试了正常的测试,这是我目前的状态,可以让任何事情发生。

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.... 我错过了什么?

-施瓦德

【问题讨论】:

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


    【解决方案1】:

    经过一些测试,我认为这是不可能的。控制器规格只是wrappers for Rails functional tests,测试类继承自ActionController::Base。为了让控制器测试能够运行,控制器必须支持requestresponse 对象,AbstractController::Base 的情况并非如此(这些是ActionController::Base 中的defined)。这就是为什么在运行测试时会出现特定错误的原因。出于同样的原因,您将无法使用控制器规范助手(期望),例如to_render,因为它们仅针对控制器规范定义,并且您的控制器类不是“控制器规范”中的“控制器” ” 感觉。

    您似乎可以进行测试的唯一选择是像测试任何其他普通 ruby​​ 类一样测试控制器。您需要将测试从 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
    

    【讨论】:

    • 谢谢。将以这种方式运行并报告。
    【解决方案2】:

    直接从 AbstractController::Base 扩展对我来说似乎是错误的可能来源。除非您正在做一些非常规的事情,否则没有理由这样做。

    您确定不打算从 ActionController::Base 继承吗? ActionController 中有一大堆模块用于渲染,这可能解释了您的测试中缺少方法的错误。

    如果切换到 ActionController::Base 不起作用。尝试从 rails 控制台运行 app.get "/path/to/action"。你得到同样的错误吗?

    【讨论】:

    • 这很可能,该类按预期工作,我正在以只读方式编写测试,然后我可以根据需要重构代码和测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多