繁体   English   中英

在Rspec中,如何测试没有路由的控制器动作?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM