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

Ruby on rails 使用非RESTful路由重定向进行RSpec控制器测试,ruby-on-rails,rspec,Ruby On Rails,Rspec,我试图测试控制器的一些基本方面,这些方面是通过一组非标准的路由实现的。我似乎无法连接到我的课程controller中相应的控制器/操作,这是通过重定向的路径到达的,该路径旨在显示为指向课程控制器 当我运行我的规范时,我要么得到一个路由错误,要么响应返回为空,我不知道如何解析它以获得有用的金块 # app/controllers/lessons_controller.rb def index ... set some instance vars ... end # The CoursesCo

我试图测试控制器的一些基本方面,这些方面是通过一组非标准的路由实现的。我似乎无法连接到我的
课程controller
中相应的控制器/操作,这是通过重定向的路径到达的,该路径旨在显示为指向
课程控制器

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

# 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:

尝试#2错误:

如果我运行类似的试错方法,而不是从
lessons\u controller\u spec.rb
文件开始(例如,在那里尝试
get:index
),我会得到类似的错误。没有为
课程#索引设置直接路线,只有重定向

我的第二个例子中的response对象是巨大的(尽管主体是空的),所以除非有人认为它有用,否则我不会包含它

我确实对非RESTful体系结构感到遗憾,但考虑到它的实际情况,有没有办法让控制器规范在
LessonsController
中针对适当的操作

Rails 3.2.12、RSpec 2.14.4、Capybara 2.0.2

实际上,测试中有两种类型的
get

一种是控制器测试。这个
get
只能接受参数为“action”,比如
:index
:show
等等。所以您只能在当前控制器测试中使用它。(这里的文件:)

另一种类型用于集成测试。此
get
可以接受任何路径作为参数

这两种类型具有相同的名称
get
,但用法不同

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

我强烈建议你现在就修改路线。这与休息与否无关,但你的路线整天都在中断转换。路径是课程,但控制器是课程,这一点是什么?为什么你要在没有路线的情况下编写课程控制员?

简短回答:没有

实际上,测试中有两种类型的
get

一种是控制器测试。这个
get
只能接受参数为“action”,比如
:index
:show
等等。所以您只能在当前控制器测试中使用它。(这里的文件:)

另一种类型用于集成测试。此
get
可以接受任何路径作为参数

这两种类型具有相同的名称
get
,但用法不同

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

我强烈建议你现在就修改路线。这与休息与否无关,但你的路线整天都在中断转换。路径是课程,但控制器是课程,这一点是什么?为什么你要在没有路线的情况下编写课程控制员?

简短回答:没有

实际上,测试中有两种类型的
get

一种是控制器测试。这个
get
只能接受参数为“action”,比如
:index
:show
等等。所以您只能在当前控制器测试中使用它。(这里的文件:)

另一种类型用于集成测试。此
get
可以接受任何路径作为参数

这两种类型具有相同的名称
get
,但用法不同

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

我强烈建议你现在就修改路线。这与休息与否无关,但你的路线整天都在中断转换。路径是课程,但控制器是课程,这一点是什么?为什么你要在没有路线的情况下编写课程控制员?

简短回答:没有

实际上,测试中有两种类型的
get

一种是控制器测试。这个
get
只能接受参数为“action”,比如
:index
:show
等等。所以您只能在当前控制器测试中使用它。(这里的文件:)

另一种类型用于集成测试。此
get
可以接受任何路径作为参数

这两种类型具有相同的名称
get
,但用法不同

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


我强烈建议你现在就修改路线。这与休息与否无关,但你的路线整天都在中断转换。路径是课程,但控制器是课程,这一点是什么?为什么你要在没有路线的情况下给课程控制员写信?

谢谢你的回复。我找不到合适的医生。我怀疑这个项目很快会有一个重大的重构…谢谢你的回复。我找不到合适的医生。我怀疑这个项目很快会有一个重大的重构…谢谢你的回复。我找不到合适的医生。我怀疑这个项目很快会有一个重大的重构…谢谢你的回复。我找不到合适的医生。我怀疑这个项目很快会有一次重大的重构。。。
# spec/controllers/courses_controller_spec.rb
...
  get :course, :course_name => Course.first.title_url
...
NoMethodError: undefined method `empty?' for nil:NilClass