【问题标题】:How do I test a nested Ruby on Rails controller with RSpec?如何使用 RSpec 测试嵌套的 Ruby on Rails 控制器?
【发布时间】:2013-01-27 23:49:46
【问题描述】:

我有一个名为 PagesController 的 Rails 控制器,它嵌套在 app/controllers/sevenpages/public/pages_controller.rb 中,如下所示:

module Sevenpages
  module Public
    class PagesController < ApplicationController
      layout nil
      def show 
      end
    end
  end
end

我想使用 RSpec

测试这个控制器

当我在 spec/controllers/sevenpages/pubic/pages_controller_spec.rb 中创建以下测试时:

require 'spec_helper'

describe Sevenpages:Public::PagesController do
  describe 'GET #show' do
    get :show, use_route: :sevenpages
    {{ tests go here }}
  end
end

我收到以下错误:

undefined method `get' for #<Class:0x007fe5c88e4300> (NoMethodError)

现在我明白这条错误消息的含义了。问题是 RSpec::Rails::ControllerExampleGroup 方法没有自动包含在控制器测试中,因此标准 Rails 方法,如 get、post 等在测试中不可用。

我已经尝试了所有推荐的解决方案,但没有运气。这是我尝试过的:

  • 确保spec/spec_helper.rb 包含require 'rspec/rails'

  • 使用以下命令显式声明测试类型:

    describe Sevenpages::Public::PagesController, type: :controller do

  • 使用以下命令明确包含控制器示例组:

    include RSpec::Rails::ControllerExampleGroup 在控制器主体中

我不知道还能尝试什么。我应该注意我正在使用:

  • Rails 3.2.11
  • RSpec 2.12.2

我的应用是 Rails 引擎,因此 use_route 参数是 get 方法。

我唯一能想到的是 RSpec 不知道如何处理嵌套如此深的控制器。是否有一些我应该注意的语法以使 RSpec 能够正确地将其解析为控制器测试?

【问题讨论】:

    标签: ruby-on-rails rspec


    【解决方案1】:

    您在上面发布的代码在描述块中进行了测试。通常使用 Rspec,您将测试放在“it”块中。喜欢:

    describe Sevenpages:Public::PagesController do
      describe 'GET #show' do
        it 'should work' do
          get :show, use_route: :sevenpages
          {{ tests go here }}
        end
      end
    end
    

    如果您尝试这样做,该方法是否会正确定义?

    【讨论】:

    • 噢!谢谢皮特。由于我的嵌套增加了复杂性,我被兔子拖到了明显的地方。好吧,希望这个问题可以作为可能的解决方案的总结,以帮助那些遇到 RSpec 无法识别其控制器的实际问题的人。 :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    相关资源
    最近更新 更多