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

jpw*_*ynn 5 controller rspec ruby-on-rails

在我的一些控制器中,我有一个没有相应路由的操作,因为它只能通过render ... and return其他控制器操作中的访问。

例如我有一个动作

def no_such_page
 # displays a generic error screen
end
Run Code Online (Sandbox Code Playgroud)

在我的 RSpec 控制器测试中,如何“获取”该方法并查看响应主体?

如果我尝试:

  get :no_such_page
  response.status.should be(200)
Run Code Online (Sandbox Code Playgroud)

它当然给出了错误

No route matches {:controller=>"foo", :action=>"{:action=>:no_such_page}"}
Run Code Online (Sandbox Code Playgroud)

Chr*_*erg 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
Run Code Online (Sandbox Code Playgroud)

但事实上,从你所写的内容来看,在我看来,你的操作中没有任何内容,你只是在测试相应视图生成的 HTML 输出。如果是这种情况,那么您实际上根本不应该在控制器规范中测试它,只需使用视图规范来测试它,这更适合测试响应正文的内容。