【问题标题】:RSpec controller testing with non-RESTful route redirects使用非 RESTful 路由重定向进行 RSpec 控制器测试
【发布时间】:2013-11-08 05:28:31
【问题描述】:

我正在尝试测试通过一组非标准路由到达的控制器的一些基本方面。我似乎无法连接到我的LessonsController 中的适当控制器/操作,这是通过似乎指向CoursesController 的重定向路由到达的。

当我运行我的规范时,我要么得到一个路由错误,要么响应返回为空,我不知道如何解析它以获得有用的块。

# app/controllers/lessons_controller.rb
def index
  ... set some instance vars ...
end

# The CoursesController has index and show methods of its own which aren't used here

# app/config/routes.rb
...
get 'courses/:course_name' => redirect('/courses/%{course_name}/lessons'), :as => "course"
get 'courses/:course_name/lessons' => 'lessons#index', :as => "lessons"
...

# spec/controllers/courses_controller_spec.rb
describe CoursesController do
  it "test some instance vars" do
    get :show, :course_name => Course.first.title_url
    assigns(:some_ivar).should_not be_empty
  end
end

错误:

AbstractController::ActionNotFound: The action 'course' could not be found for CoursesController

RSpec 尝试 #2:

# spec/controllers/courses_controller_spec.rb
...
  get :course, :course_name => Course.first.title_url
...

尝试 #2 错误:

NoMethodError: undefined method `empty?' for nil:NilClass

如果我从lessons_controller_spec.rb 文件开始运行类似的试错方法(例如,在那里尝试get :index),我会得到类似的错误。没有为lessons#index 设置直接路由,只有重定向。

我的第二个示例中的响应对象很大(虽然主体是空的),所以我不会包含它,除非有人认为它有用。

我肯定对非 RESTful 架构感到遗憾,但考虑到它是什么,是否有任何想法如何让控制器规范针对 LessonsController 中的适当操作?

Rails 3.2.12、RSpec 2.14.4、Capybara 2.0.2

【问题讨论】:

    标签: ruby-on-rails rspec


    【解决方案1】:

    简短回答:不。

    实际上测试中有两种get

    一种用于控制器测试。这个get 只能接受参数作为“动作”,比如:index:show 等。所以你只能在当前控制器测试中使用它。 (此处的文档:http://api.rubyonrails.org/classes/ActionController/TestCase/Behavior.html#method-i-get

    另一种类型用于集成测试。这个get 可以接受任何路径作为参数。 http://api.rubyonrails.org/classes/ActionDispatch/Integration/RequestHelpers.html#method-i-get

    这两种类型同名get,但用法不同。

    您的问题是控制器测试。所以你使用第一个。您只能在 CoursesController 中执行操作。这就是你遇到错误的原因。

    我强烈建议您现在修改路线。这不是关于 RESTful 与否,而是您的路线整天都在中断转换。路径是课程,但控制器是课程有什么意义?为什么在没有路线的情况下编写 Course 控制器?

    【讨论】:

    • 感谢您的好评。我很难找到合适的文档。我怀疑这个项目很快就会进行重大重构......
    猜你喜欢
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 2018-02-11
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多