2

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

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在控制器主体中

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

  • 导轨 3.2.11
  • RSpec 2.12.2

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

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

4

1 回答 1

3

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

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

于 2013-01-28T01:17:28.637 回答