如何使用RSpec测试嵌套的Ruby on Rails控制器?

时间:2013-01-27 23:49:47

标签: ruby-on-rails rspec

我有一个名为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方法,如getpost等。

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

  • 确保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能够正确地将其解析为控制器测试?

1 个答案:

答案 0 :(得分:3)

您在上面发布的代码在describe块中进行了测试。通常使用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

如果您尝试这样做,方法会被正确定义吗?