使用非 RESTful 路由重定向进行 RSpec 控制器测试



我正在尝试测试通过一组非标准路由到达的控制器的一些基本方面。 我似乎无法连接到我的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内的适当操作?

导轨 3.2.12, RSpec 2.14.4, 水豚 2.0.2

简短回答:不。

实际上,测试中有两种类型的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但用法不同。

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

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

最新更新