在我的一些控制器中,我有一个没有相应路径的动作,因为它只能通过其他控制器动作中的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}"}
答案 0 :(得分:2)
<强>更新强>
回顾一下您的问题,现在对我来说没有任何意义,因为您说您只是通过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测试它,这更适合测试响应体的内容。
答案 1 :(得分:0)
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