[英]In Rspec, how test a controller action that does not have a route?
在我的一些控制器中,我有一个动作没有相应的路由,因为它只能通过render ... and return
访问render ... and return
其他控制器动作。
例如,我有一个动作
def no_such_page
# displays a generic error screen
end
在我的RSpec控制器测试中,如何“获取”该方法并查看响应主体?
如果我尝试:
get :no_such_page
response.status.should be(200)
它当然会给出错误
No route matches {:controller=>"foo", :action=>"{:action=>:no_such_page}"}
更新资料
回顾您的问题,现在对我来说已经没有意义了,因为您说您仅通过render ... and return
来访问此动作,而render
渲染一个视图,而不是一个动作。 您确定要执行此操作吗? 我认为查看规格是进行此测试的地方。
原始答案
测试永远不会通过HTTP请求调用的动作的响应代码是没有意义的。 同样, get :no_such_page
也没有意义,因为您无法“获取”操作(没有路由),您只能调用该方法。
从这个意义上讲,测试它的最佳方法是将其像对待类上的任何其他方法一样对待,在这种情况下,该类是您的控制器,例如PostsController
。 因此,您可以执行以下操作:
describe PostsController do
... other actions ...
describe "no_such_page" do
it "displays a generic error screen" do
p = PostsController.new
p.should_receive(:some_method).with(...)
p.no_such_page
end
end
end
但是实际上,从您编写的内容来看,我觉得您的操作没有任何内容,而您只是在测试相应视图生成的HTML输出。 如果是这种情况,那么您实际上根本就不应该在控制器规格中进行测试,而只需使用view spec进行测试,它更适合于测试响应主体的内容。
before :all do
Rails.application.routes.draw do
get '/no_such_page', to: "foo#no_such_page"
end
end
after :all do
Rails.application.reload_routes!
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.